查看 iTunes 可视化工具 API 的示例代码,有一个包含波形和频谱数据的数据 struct
:
struct RenderVisualData {
UInt8 numWaveformChannels;
UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries];
UInt8 numSpectrumChannels;
UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries];
};
typedef struct RenderVisualData RenderVisualData;
有 2 个 channel (kVisualMaxDataChannels
)和 512 个波形和频谱数据点(kVisualNumWaveformEntries
和 kVisualNumSpectrumEntries
),相当于 0 之间的整数和 255。
这些对于音频的视觉表示很有用。我想将这些数据(或类似数据)转换为以 Hz
测量的频率,以便将它们转换为乐谱(本质上是音符)。
此过程涉及哪些资源、算法等?这些数据是傅立叶系数吗?鉴于这些数据,我如何才能回到给定时间点的频率,我可以将其映射到音符?
最佳答案
我建议查看一些开源项目并尝试从中学习。 FFT Guitar Tuner .另外,如果你更认真地学习 DSP,你可以在你的 pipe 上搜索数字信号处理并观看关于这个主题的完整讲座系列。找到音频 block 的音符并不是最简单的任务,因为我发现自己正在尝试编写吉他调音器的程序。据我了解(我不是该领域的专家)获取音调信息需要采取的步骤是:
- 取一些音频数据样本,最好是二的幂(256,512、1024 等)
- (可选)应用一个窗口函数,使边缘平滑,看起来就像连续的时间信号(终点与起点匹配)。
- 进行快速傅立叶变换
- 音调提取算法。有几种不同的算法,具体取决于您的需要。根据我的经验,最简单的是 Harmonic Product Spectrum,它将找到您处理的音频 block 的基频。
关于c - 如何编写提供频率信息的 iTunes 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867265/