我正在使用 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 的信息,但我希望得到两个垂直 Lollipop 。 我注意到的另一件事是错误的,当我从文件中读取声音后播放声音时,它变长了,音高明显降低了。 我猜是采样率问题,但我真的不知道该怎么办。
提前感谢您的帮助。
最佳答案
那是因为您没有绘制幅度。您绘制的是系数,但这些系数是复数值。因此,水平轴是实数分量,垂直轴是虚数分量。此外,当您使用 sound
时就其本身而言,默认采样频率为 8 kHz(准确地说是 8192 Hz),这解释了为什么您的声音音调较低。您需要将采样频率用作 sound
的第二个参数,这是由 audioread
的第二个输出提供给您的。
因此,尝试将 abs
放在 fft
调用之后,并在 sound
中使用 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,
到 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);
水平轴现在反射(reflect)每个分量的正确频率,垂直轴反射(reflect)每个分量的大小。
通过运行生成 600 Hz 正弦音的音频生成代码,然后运行上面的代码绘制频谱,我得到了这个:
请注意,我在频谱的正侧插入了一个工具提示...它大约是 600 Hz!
关于matlab - wav文件和FFT的matlab中的Audioread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036773/