【问题标题】:Plot only one half of FFT in matlab在matlab中只绘制FFT的一半
【发布时间】:2015-01-08 22:11:00
【问题描述】:

我想在一个图中显示幅度和频率。它只显示两半。 (我的声音长度是 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)');

现在它仍然显示两边,有人知道为什么吗?

【问题讨论】:

  • X_mags2 在您的代码中未定义。我假设这是存储频率分解的幅度。您能否更新您的代码以向我们展示该声明?考虑清理你的代码以消除一些无关的部分。我可以看到几行不会增加您的问题。
  • 编辑了,使用rms和使用dataOut^2是一样的吧?
  • 不,不幸的是。

标签: matlab fft


【解决方案1】:

您没有得到正确结果的原因是您混淆了 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);

声明N 之后你做了wavread。因此,如果你说你的信号是 1 秒,那么这应该意味着元素的总数应该是 44100。当你用 wavread 读入你的信号时,验证 N 是否等于 44100。

【讨论】:

  • 我把一首曲目剪掉了 1 秒。
  • @user4390280 - 你的采样频率是多少?是44100吗?因为如果您收到88200 的信号长度,这意味着您将剪掉两秒钟的数据,如果numel(x1) = 88200 并且您的采样频率为 44.1 kHz
  • 可能是我的错,有没有办法根据样本的数量来计算采样频率?
  • @user4390280 - 不。您获得的样本数量与采样频率无关。顺便说一句,您致电wavread 已经为您提供了采样频率。它是wavread 的第二个输出参数,即fs_orig。但是,我告诉您,您只需将信号的长度除以 2。您以默认​​方式调用 fft,它为您提供了信号长度的总点数。如果您想绘制频谱的一半,只需将长度除以 2。我不知道您是如何不让它工作的。
  • 还是我的录音有误?因为我应该有 44100 个样本/秒,每个样本 16 位,并且需要选择其中的一秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2015-11-09
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多