2012-01-15 42 views
1

寻找在用于iTunes可视化API的示例代码,有一个数据struct包含波形和光谱数据:如何写一个iTunes的插件提供的频率信息

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中测量的频率,以便将它们转换为音符(基本上是音符)。

这个过程涉及哪些资源,算法等?这些数据傅立叶系数?根据这些数据,我可以如何回到特定时间点的频率,我可以将其映射到一个音符?

回答

1

我会建议看一些开源项目,并尝试从他们那里学习。 FFT Guitar Tuner。另外,如果你更加认真的学习DSP,你可以搜索你的数字信号处理软件并观看关于这个主题的完整系列讲座。找到一个音频块的音符并不是最简单的任务,因为我发现自己试图编程一个吉他调音器。据我所知(即时没有此字段的一个专家),其需要采取用于获取音调信息的步骤是:

  1. 采取音频数据的一些样品,优选地在两(256512,1024等)的功率
  2. (可选)应用一个窗口函数,以使其平滑出边缘,并显示为连续时间信号(终点与起点匹配)。
  3. 进行快速傅立叶变换
  4. 音调提取算法。根据您的需要,有几种不同的算法。根据我的经验,最容易的是Harmonic Product Spectrum,它可以找到您处理的音频块的基本频率。
1

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

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