在wav文件和FFT的matlab中的Audioread

时间:2015-05-04 18:00:08

标签: matlab audio signal-processing fft

我正在使用Matlab,我想在之前在Matlab上录制的wav文件上执行FFT。

fs = 44100; % Hz
t = 0:1/fs:1; % seconds
f = 600; % Hz

y = sin(2.*pi.*f.*t);

audiowrite('600freq.wav',y,fs)

这是我在wav文件中录制的方式。 现在到读取和FFT部分:

[y,Fs] = audioread('600freq.wav');
sound(y)
plot(fft(y))

这是我得到的FFT图:

enter image description here

也许我错过了关于FFT的一些内容,但我期待两个垂直的棒棒糖。 我注意到的另一件事是错误的,就是当我从文件中读取它后播放声音时,声音越长,音高越低。 我的猜测是一个采样率问题,但我真的不知道该怎么办。

感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:7)

那是因为你没有绘制幅度。您正在绘制的是系数,但这些是复杂的。因此,水平轴是真实组件,垂直轴是虚构组件。此外,当您单独使用sound时,默认采样频率为8 kHz(确切地说是8192 Hz),这可以解释为什么您的声音音调较低。您需要将采样频率用作sound的第二个参数,以及audioread的第二个输出给您的。

因此,请尝试在abs来电后放置fft,并将Fs用于sound

[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是二进制数,Fs是采样频率,N是您用于FFT的点数。 F是您正在查看的组件的解释频率。

默认情况下,fft会假定N是数组中的总点数。对于单侧FFT,由于奈奎斯特采样定理,i0, 1, 2,变为floor((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正弦音的音频生成代码,然后使用上面的代码绘制光谱,我得到了这个:

enter image description here

请注意,我在光谱的正面插入了一个工具尖端......它的频率约为600 Hz!