我想在一个图中显示幅度和频率。它只显示两半。 (我的声音长度是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)');
现在它仍然显示双方,任何人都知道为什么?
答案 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。