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

时间:2012-01-15 03:04:02

标签: c audio itunes signal-processing

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

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

    UInt8 numSpectrumChannels;
    UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries];
};
typedef struct RenderVisualData RenderVisualData;

有2个通道(kVisualMaxDataChannels)和512个波形和频谱数据点(kVisualNumWaveformEntrieskVisualNumSpectrumEntries),相当于0到255之间的整数。

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

此流程涉及哪些资源,算法等?这些数据是傅里叶系数吗?根据这些数据,我如何回到给定时间点的频率,我可以将其映射到音符?

2 个答案:

答案 0 :(得分:1)

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

  1. 取一些音频数据样本,最好是2(256,512,1024等)
  2. (可选)应用窗口函数,以便平滑边缘并显示为连续时间信号(终点与起点匹配)。
  3. 快速傅立叶变换
  4. 音高提取算法。根据您的需要,有几种不同的算法。根据我的经验,最简单的是谐波产品频谱,它将找到您处理的音频块的基本频率。

答案 1 :(得分:1)

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

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