那是因为你没有绘制幅度.您正在绘制的是系数,但这些是复杂的.因此,水平轴是实部,垂直轴是虚部.此外,当您单独使用
sound时,默认采样频率为8 kHz(准确地说是8192 Hz),这可以解释为什么您的声音音调较低.您需要将采样频率用作声音的第二个参数,并由audioread的第二个输出提供给您.
所以,尝试在fft调用后放置abs并将Fs用于声音:
[y,Fs] = audioread('600freq.wav');
sound(y, Fs);
plot(abs(fft(y)))
此外,上面的代码没有正确绘制水平轴.如果您想这样做,请在进行傅立叶变换后确保fftshift光谱,然后正确标记轴.如果你想确定每个水平值在频率方面是什么,那么Paul R这篇精彩的帖子就可以解决这个问题:How do I obtain the frequencies of each value in an FFT?
基本上,FFT中的每个水平值都是这样的:
F = i * Fs / N
i是bin编号,Fs是采样频率,N是您用于FFT的点数. F是您正在查看的组件的解释频率.
默认情况下,fft假定N是数组中的总点数.对于单侧FFT,由于奈奎斯特采样定理,i从0,1,2变为最大值((N-1)/ 2).
因为你在你试图写的代码中实际做的是显示光谱的两侧,这就是为什么将光谱居中以使DC频率位于中间而左侧是负光谱并且右侧是正光谱.
我们可以在此处将其合并到您的代码中:
[y,Fs] = audioread('600freq.wav');
sound(y, Fs);
F = fftshift(abs(fft(y)));
f = linspace(-Fs/2, Fs/2, numel(y)+1);
f(end) = [];
plot(f, F);
水平轴现在反映每个组件的正确频率以及反映每个组件大小的垂直轴.
通过运行生成600 Hz正弦音的音频生成代码,然后使用上面的代码绘制光谱,我得到:
请注意,我在光谱的正面插入了一个工具尖端……它大约是600赫兹!