我正在寻找一种从WAV文件中提取数据的方法,这对我正在尝试实现的FFT算法非常有用。到目前为止,我所拥有的是左右音频通道的一组十六进制值,但我对如何将其转换为FFT的时域和频域有点遗憾。
以下是我需要的例子:
3.6 2.6
2.9 6.3
5.6 4.0
4.8 9.1
3.3 0.4
5.9 4.8
5.0 2.6
4.3 4.1
这是接收FFT数据的函数原型:
void fft(int N, double (*x)[2], double (*y)[2])
其中N是FFT的点数,x是指向时域采样的指针,y是指向频域采样的指针。
谢谢!
答案 0 :(得分:3)
出于测试目的,您无需从WAV文件中提取波形数据。你可以在内存中生成一些信号(例如0,非零常数,正弦曲线,2个叠加的正弦曲线,白噪声)然后在它们上测试你的FFT函数,看看你是否得到了你应该得到的东西(0为0,非零恒定信号的零频率峰值,每个正弦波的2个峰值,白噪声所有频率的均匀非零幅度)。
如果您真的想解析WAV文件,请参阅格式Wikipedia(点击链接)。使用原始PCM编码或A /μ律PCM编码(AKA G.711)。
FFT通常使用就地算法实现,这意味着输出会替换输入。如果你这样做,你真的不需要第二个指针。
答案 1 :(得分:0)
最常见的WAVE / RIFF文件格式有一个44字节的标头,后跟16位或2字节的小端有符号整数样本,交错用于立体声。因此,如果您知道如何跳过字节,并将简短的整数读入双精度数,那么您应该很高兴。
只需将您想要的时域数据长度作为实际分量矢量提供给FFT; FFT的结果将是一个复杂的频域矢量。