C 如何编写提供频率信息的iTunes插件

C 如何编写提供频率信息的iTunes插件,c,audio,itunes,signal-processing,C,Audio,Itunes,Signal Processing,查看iTunes visualizer API的示例代码,有一个包含波形和频谱数据的数据结构: struct RenderVisualData { UInt8 numWaveformChannels; UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries]; UInt8 numSpectrumChannels; UInt8 spectrumData[kVisualMaxDataC

查看iTunes visualizer API的示例代码,有一个包含波形和频谱数据的数据结构:

struct RenderVisualData {
    UInt8 numWaveformChannels;
    UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries];

    UInt8 numSpectrumChannels;
    UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries];
};
typedef struct RenderVisualData RenderVisualData;
有2个通道(
kVisualMaxDataChannels
)和512个波形和频谱数据点(
kVisualNumWaveformEntries
kVisualNumSpectrumEntries
),相当于0到255之间的整数

这些对于音频的视觉表示非常有用。我想将这些数据(或类似数据)转换为以
Hz
为单位测量的频率,以便将它们转换为乐谱(基本上是音符)


此过程涉及哪些资源、算法等?这些数据是傅里叶系数吗?有了这些数据,我如何才能回到给定时间点的频率,并将其映射到注释中?

我建议寻找一些开源项目,并尝试从中学习。此外,如果您更认真地学习DSP,您可以搜索数字信号处理管,并观看有关此主题的完整系列讲座。找到一个音频块的音符并不是最容易的任务,因为我发现自己正在尝试编程一个吉他调谐器。据我所知(我不是该领域的专家),获取音高信息需要采取以下步骤:

  • 采集一些音频数据样本,最好是两次方(256512、1024等)
  • (可选)应用窗口功能,使其平滑边缘并显示为连续时间信号(终点与起点匹配)
  • 以快速傅里叶变换为例
  • 基音提取算法。根据您的需要,有几种不同的算法。在我的经验中,最简单的是谐波积谱,它会找到你们处理过的音频块的基频

  • 两个警告。光谱数据和音符不是一回事。来自FFT的频谱数据在每个频率单元(或阵列元素)之间的频率间隔与在相等的调和音高之间的频率间隔完全不同,并且单个音高通常由包含多个频谱单元的丰富频谱表示

    每个仓的中心频率与采样率除以隐含FFT处理的数据长度有关