wav文件和FFT的matlab中的Audioread

Audioread in matlab of wav file and 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 图:

也许我遗漏了一些有关 FFT 的信息,但我希望得到两个垂直棒棒糖。 我注意到的另一件事是错误的,当我从文件中读取声音后播放声音时,它变长了,音高明显降低了。 我的猜测是采样率问题,但我真的不知道该怎么办。

提前感谢您的帮助。

那是因为你没有绘制震级。您绘制的是系数,但这些系数是复数值。因此,水平轴是 实数 分量,垂直轴是 虚数 分量。此外,当您单独使用 sound 时,默认采样频率为 8 kHz(准确地说是 8192 Hz),这解释了为什么您的声音音调较低。您需要将采样频率用作 sound 的第二个参数,这是由 audioread.

的第二个输出提供给您的

因此,尝试将 abs 放在 fft 调用之后,并将 Fs 用于 sound:

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

此外,上面的代码没有正确绘制水平轴。如果您想这样做,请确保 fftshift your spectra after you take the Fourier transform, then label your axis properly. If you want to determine what each horizontal value is in terms of frequency, this awesome post by Paul R does the trick: 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,由于奈奎斯特采样定理,i0, 1, 2, 上升到 floor((N-1)/2)

因为您在尝试编写的代码中实际做的是显示频谱的两侧,这就是为什么最好将频谱居中,以便直流频率位于中间,而左侧是负光谱,右侧是正光谱。

我们可以将其合并到您的代码中:

[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 Hz!