在matlab中仅绘制FFT的一半

时间:2015-01-08 22:11:00

标签: matlab fft

我想在一个图中显示幅度和频率。它只显示两半。 (我的声音长度是1秒!)

fs_orig = 44100;
nbits = 16;
N=44100; %amount of samples???
[x1,fs_orig,nbits]=wavread('Mysong.wav');
[B2,A2] = butter(4,[5875 6500]/(fs_orig/2),'bandpass');

dataIn = x1; %your music
dataOut2 = filter(B2, A2, dataIn);
data_pow2 = dataOut2.^2;

X_mags2 = abs(fft(data_pow2));

bin_vals = [0 : N-1];
fax_Hz = bin_vals*fs_orig/N;
N_2 = ceil(N/2);

plot(fax_Hz(1:N_2), 20*log10(X_mags2(1:N_2)))
xlabel('Frequency (Hz)')
ylabel('Magnitude (dB)');

现在它仍然显示双方,任何人都知道为什么?

1 个答案:

答案 0 :(得分:0)

您没有得到正确结果的原因是因为您将FFT产生的总点数与您的采样频率(44.1 kHz)相比较令人困惑。

FFT计算的默认点数与输入信号的长度相等。因此,如果您的信号data_pow2有128个点,那么输出也将有128个点。您可以通过为其指定附加参数来手动指定所需FFT中的点数:

B = fft(A, N);

此处,N将是您希望FFT拥有的点数。不指定这将假设您希望总点数为输入的长度。因此,您实际需要做的是将N更改为信号的长度。因此,您需要这样做:

[x1,fs_orig,nbits]=wavread('Mysong.wav');
N = numel(x1);

在<{strong>> N之后声明wavread 。因此,如果您说您的信号是1秒,那么这应该意味着元素的总数应该是44100.当您使用N读入信号时,请确认wavread等于44100。