poster
2019-12-10, 20:48
我正在使用Matlab进行信号的FFT,并且陷入了标准化问题。具体来说,如何将频谱标准化为dBm单位。我知道0.316228是正确的归一化因子,但是我的问题与如何正确归一化垃圾箱有关。
我创建了以下程序来提出我的问题。只需将其剪切并粘贴到Matlab中即可运行。在线查看问题。
特别是,我对如何标准化垃圾箱感到困惑。例如,如果FFT的索引为1:end,而end为偶数,则在计算FFT幅度谱时,是否应将索引2:(end / 2)乘以(2 / N)?类似地,是否以奈奎斯特频率(位于索引末端/ 2 + 1)将bin归一化为(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 (eg 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)放在正向和逆变换的前面。
更多&回答... (https://stackoverflow.com/questions/4055921)
我创建了以下程序来提出我的问题。只需将其剪切并粘贴到Matlab中即可运行。在线查看问题。
特别是,我对如何标准化垃圾箱感到困惑。例如,如果FFT的索引为1:end,而end为偶数,则在计算FFT幅度谱时,是否应将索引2:(end / 2)乘以(2 / N)?类似地,是否以奈奎斯特频率(位于索引末端/ 2 + 1)将bin归一化为(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 (eg 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)放在正向和逆变换的前面。
更多&回答... (https://stackoverflow.com/questions/4055921)