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

标签 c audio itunes signal-processing

查看 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 个波形和频谱数据点(kVisualNumWaveformEntrieskVisualNumSpectrumEntries),相当于 0 之间的整数和 255。

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

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

最佳答案

我建议查看一些开源项目并尝试从中学习。 FFT Guitar Tuner .另外,如果你更认真地学习 DSP,你可以在你的 pipe 上搜索数字信号处理并观看关于这个主题的完整讲座系列。找到音频 block 的音符并不是最简单的任务,因为我发现自己正在尝试编写吉他调音器的程序。据我了解(我不是该领域的专家)获取音调信息需要采取的步骤是:

  1. 取一些音频数据样本,最好是二的幂(256,512、1024 等)
  2. (可选)应用一个窗口函数,使边缘平滑,看起来就像连续的时间信号(终点与起点匹配)。
  3. 进行快速傅立叶变换
  4. 音调提取算法。有几种不同的算法,具体取决于您的需要。根据我的经验,最简单的是 Harmonic Product Spectrum,它将找到您处理的音频 block 的基频。

关于c - 如何编写提供频率信息的 iTunes 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867265/

相关文章:

c++ - Windows 7 上代码块中的 gdk (gtk3)

c - 如何将单个头文件应用于 C 项目的其余部分以便不再需要它?

C - Glib GINT_TO_POINTER 可移植性

php - 使用 FFMPEG 将图像和音频文件转换为视频

ios - 从 iPhone 应用程序更新歌曲/轨道信息

C代码无法编译

swift - 音频向前跳转按钮

actionscript-3 - Flash中内存有效的声音管理

iOS:播放时从 iTunes 音乐轨道中读取实时音频数据

ios - iPad 应用程序在哪里存储数据?