Tac*_*act 12 c audio signal-processing wav fftw
我们说我有一个WAV文件.在此文件中,是精确1秒间隔的一系列正弦音.我想使用FFTW库按顺序提取这些音调.这特别难吗?我该怎么做?
另外,将这种音调写入WAV文件的最佳方法是什么?我假设我只需要一个简单的音频库来输出.
我选择的语言是C.
Pau*_*l R 22
要获得文件的一部分的功率谱:
收集N个样本,其中N是2的幂 - 如果你的采样率是44.1 kHz,你想要大约每秒采样一次,那就说N = 32768个样本.
将窗口样本传递给FFT例程 - 理想情况下,您需要一个实际到复数的FFT,但如果您只有一个是复杂到复杂的FFT,则为所有虚拟输入部分传递0
计算FFT输出箱的平方幅度(re*re + im*im)
(可选)计算每个幅度平方输出仓的10*log10,得到以dB为单位的幅度值
现在你已经拥有了你的功率谱,你只需要确定峰值,如果你有一个合理的信噪比,这应该非常简单.注意,频率分辨率随着N的增大而提高.对于上述44.1kHz采样率和N = 32768的示例,每个箱的频率分辨率为44100/32768 = 1.35Hz.
WAV 文件包含线性脉冲编码调制 (LPCM)数据。这仅仅意味着它是固定采样率的幅度值序列。文件开头包含 RIFF 标头,用于传达采样率和每个样本位数(例如 8 kHz 带符号 16 位)等信息。
格式非常简单,您可以轻松地推出自己的格式。但是,有几个库可用于加速该过程,例如libsndfile。Simple Direct-media Layer (SDL) / SDL_mixer和PortAudio是两个不错的播放库。
至于将数据输入 FFTW,您需要缓冲 1 秒的块(根据采样率和每个样本的位数确定大小)。然后将所有样本转换为 IEEE 浮点(即float或double取决于 FFTW 配置——libsndfile可以为您完成此操作)。接下来创建另一个数组来保存频域输出。最后,通过将两个缓冲区传递给返回的句柄fftw_plan_dft_r2c_1d并进行调用来创建并执行 FFTW 计划。fftw_executefftw_plan