gpt4 book ai didi

matlab - 基本的 FFT 归一化问题

转载 作者:太空宇宙 更新时间:2023-11-03 20:22:45 38 4
gpt4 key购买 nike

我正在使用 Matlab 对信号进行 FFT,但我在归一化方面遇到了困难。具体来说,如何将频谱归一化为 dBm 单位。我知道 0.316228 是正确的归一化因子,但我的问题与如何正确归一化 bin 有关。

我创建了以下程序来提出我的问题。只需将其剪切并粘贴到 Matlab 中,它就会自行运行。在线查看问题。

特别是,我对如何标准化 bin 感到困惑。例如,如果 FFT 有索引 1:end,其中 end 是偶数,当我计算 FFT 幅度谱时,我应该乘以 (2/N) 来得到索引 2:(end/2) 吗?同样,奈奎斯特频率的 bin(位于索引端/2+1)是否被归一化为 (1/N)?我知道有很多方法可以根据个人兴趣进行标准化。假设我使用的信号(下面的 St)是从 ADC 捕获的电压。

非常感谢任何反馈。提前致谢!

%% 1. Create an Example Signal
N = 2^21 ; % N = number of points in time-domain signal (St)
St = 1 + rand(N,1,'single'); % St = example broadband signal (e.g. random noise)

% take FFT
Sf = fft(St, N);
Sf_mag = (2/N)*abs(Sf(1: N/2 + 1));
Sf_dBm = 20*log10(Sf_mag / 0.316228); % 0.316338 is peak voltage of 1 mW into 50 Ohms

% Q: Are Sf_mag and Sf_dBm normalized correctly? (assume 0.316338 is correct
% peak voltage to get 1mW in 50 Ohms)
% Q: Should Sf_mag(fftpoints/2 + 1) = (1/N)*abs(Sf(fftpoints/2 + 1) for correct normalization
% of Nyquist frequency? (since Nyquist frequency is not folded in frequency
% like the others are)

%% 2. Plot Result

% create FFT spectrum x-axis
samplerate = 20e9; % 20 Gsamples/sec
fft_xaxis = single(0 : 1 : N/2)';
fft_xaxis = fft_xaxis * single(samplerate/N);

semilogx(fft_xaxis, Sf_dBm, 'b-')
xlabel('Frequency (Hz)');
ylabel('FFT Magnitude (dBm)');
title('Spectrum of Signal (Blue) vs Frequency (Hz)');
xlim([1e4 1e10]);
grid on;

最佳答案

我不是很清楚你想要完成什么,但这里有一些技巧可以让你调试自己的程序。

执行 fft([1 1 1 1])。执行 fft([1 1 1 1 1 1 1 1])。尤其要观察输出幅度。是否如您所愿?

然后执行fft([1 -1 1 -1])。执行 fft([1 -1 1 -1 1 -1 1 -1])。重复各种信号长度和频率。这应该允许您相应地规范化您的信号。

另外,对 ifft 而不是 fft 做同样的事情。这些是对各种 FFT 实现的良好完整性检查,因为虽然大多数实现可能会将 1/N 放在逆变换的前面,但其他实现可能会把 1/sqrt(N)在正向和反向变换之前。

关于matlab - 基本的 FFT 归一化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4055921/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com