matlab - wav文件和FFT的matlab中的Audioread

标签 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 的信息,但我希望得到两个垂直 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,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);

水平轴现在反射(reflect)每个分量的正确频率,垂直轴反射(reflect)每个分量的大小。

通过运行生成 600 Hz 正弦音的音频生成代码,然后运行上面的代码绘制频谱,我得到了这个:

enter image description here

请注意,我在频谱的正侧插入了一个工具提示...它大约是 600 Hz!

关于matlab - wav文件和FFT的matlab中的Audioread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036773/

相关文章:

audio - 是否可以通过标准 GET 请求将广告或消息动态拼接到 MP3 文件中?

javascript - 录制音频并发送到 Symfony

matlab - 为什么我的低通滤波器会放大信号?

matlab - Matlab中非数元素的索引

oop - MATLAB - 设置/获取结构字段的访问权限?

matlab - 在特定位置查找索引的最简单/计算有效的方法是什么?

ios - 如何在 iPhone 应用程序中切换扬声器和耳机

Java:声音捕获和波形绘制

audio - praat从WAV文件中获取频率持续时间列表

matlab - MATLAB inputParser 中的异常行为