在matlab中仅绘制FFT的一半
我想在一个图中显示振幅和频率。它只显示两半。(我的声音长度为1秒!)在matlab中仅绘制FFT的一半,matlab,fft,Matlab,Fft,我想在一个图中显示振幅和频率。它只显示两半。(我的声音长度为1秒!) 现在它仍然显示了两面,有人知道为什么吗?没有得到正确结果的原因是,与采样频率(44.1 kHz)相比,FFT产生的总点数混淆了 FFT计算的默认点数等于输入信号的长度。因此,如果您的信号data_pow2有128个点,那么输出也将有128个点。通过为FFT指定一个附加参数,可以手动指定所需的FFT点数: B = fft(A, N); 这里,N是您希望FFT具有的点数。不指定此选项将假定您希望总点数为输入的长度。因此,您实际需
现在它仍然显示了两面,有人知道为什么吗?没有得到正确结果的原因是,与采样频率(44.1 kHz)相比,FFT产生的总点数混淆了 FFT计算的默认点数等于输入信号的长度。因此,如果您的信号
data_pow2
有128个点,那么输出也将有128个点。通过为FFT指定一个附加参数,可以手动指定所需的FFT点数:
B = fft(A, N);
这里,N
是您希望FFT具有的点数。不指定此选项将假定您希望总点数为输入的长度。因此,您实际需要做的是将N
改为信号的长度。因此,您需要执行以下操作:
[x1,fs_orig,nbits]=wavread('Mysong.wav');
N = numel(x1);
在执行
wavread
后声明。因此,如果你说你的信号是1秒,那么这意味着元素的总数应该是44100。当您使用wavread
读取信号时,验证N
等于44100X\u mags2
在代码中未定义。我假设它存储了频率分解的大小。你能更新你的代码,让我们看看你的声明吗?考虑清理你的代码,以消除一些无关的部分。我可以看到一些没有增加您的问题的行。使用rms编辑它和使用dataOut ^2是一样的,对吗?不,这并不不幸。我从一个曲目中删去了1秒。@user4390280-您的采样频率是多少?是不是44100
?因为如果你得到的信号长度是88200
,这意味着你要删除两秒钟的数据,而不是一秒钟,如果numel(x1)=88200
,你的采样频率是44.1khz,那可能是我的错误,有没有办法根据样本量计算采样频率?@user4390280-没有。获得的样本数与采样频率无关。顺便说一句,您对wavread的调用已经给出了采样频率。这是wavread
的第二个输出参数,作为fs\u orig
。然而,我告诉你,你只需要把信号的长度除以2。您正在以默认方式调用fft
,这将为您提供总点数作为信号长度。如果你想画出光谱的一半,只需将长度除以2即可。我不知道你怎么不让它工作。还是我的录音有误?因为我应该有44100个样本/秒,每个样本16位,并且需要选择其中的一秒。
[x1,fs_orig,nbits]=wavread('Mysong.wav');
N = numel(x1);