Den*_*dov 3 audio matlab 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)
Run Code Online (Sandbox Code Playgroud)
这是我在wav文件中录制的方式.现在到读取和FFT部分:
[y,Fs] = audioread('600freq.wav');
sound(y)
plot(fft(y))
Run Code Online (Sandbox Code Playgroud)
这是我获得的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)))
Run Code Online (Sandbox Code Playgroud)
此外,上面的代码没有正确绘制水平轴.如果要这样做,fftshift请在进行傅里叶变换后确保光谱,然后正确标记轴.如果你想确定每个水平值在频率方面是什么,Paul R的这篇精彩帖子就可以解决这个问题:如何获得FFT中每个值的频率?
基本上,FFT中的每个水平值都是这样的:
F = i * Fs / N
Run Code Online (Sandbox Code Playgroud)
i是bin编号,Fs是采样频率,N是您用于FFT的点数. F是您正在查看的组件的解释频率.
默认情况下,fft假设这N是数组中的总点数.对于单面FFT,i从进入0, 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);
Run Code Online (Sandbox Code Playgroud)
水平轴现在反映每个组件的正确频率以及反映每个组件大小的垂直轴.
通过运行生成600 Hz正弦音的音频生成代码,然后使用上面的代码绘制光谱,我得到:

请注意,我在光谱的正面插入了一个工具尖端......它大约是600赫兹!