Matlab 需要关于FFT输出缩放的帮助吗

Matlab 需要关于FFT输出缩放的帮助吗,matlab,fft,Matlab,Fft,我目前正在学习维迪·萨普塔里的《傅里叶变换光谱学仪器工程》一书。我的问题与下面的代码有关,基于书中附录C中的代码。下面的代码分别计算波数为[cm-1]5000、10000和15000的3个波的干涉图,然后执行FFT检索信息。未标度输出的大小为1600,而不是1 clear; % Sampling clock signal generation samp_period_nm = 632.8 / 4; % sampling period in nm. 632.8 is the HeNe laser'

我目前正在学习维迪·萨普塔里的《傅里叶变换光谱学仪器工程》一书。我的问题与下面的代码有关,基于书中附录C中的代码。下面的代码分别计算波数为[cm-1]5000、10000和15000的3个波的干涉图,然后执行FFT检索信息。未标度输出的大小为1600,而不是1

clear;
% Sampling clock signal generation
samp_period_nm = 632.8 / 4; % sampling period in nm. 632.8 is the HeNe laser's wavelength
samp_period = 1 * samp_period_nm * 10^-7; % sampling period in cm. 
scan_dist   = 0.1; % mirror scan distance in cm. 
no_elements = floor(scan_dist/samp_period);
x_samp = 0:samp_period:samp_period*no_elements; %Vector of clock signals in cm
xn_samp = x_samp .* (1 + rand(1, length(x_samp)));
v1 = 5000;
v2 = 10000;
v3 = 15000;
arg  = 4 * pi * x_samp;
y   = cos(arg*v1) + cos(arg*v2) + cos(arg*v3) ;
total_data = 2^18;
no_zero_fills=[total_data - length(y)];
zero_fills=zeros(1, no_zero_fills);
%triangular apodization
n_y = length(y);
points = 1:1:n_y;
tri = 1 - 1/(n_y) * points(1:n_y);
y = y.*tri; %dot product of interferogram with triangular apodization function
y = [y zero_fills];   %zero filling
% FFT operation
fft_y = fft(y);
% fft_y = fft_y / n_y;
% fft_y = fft_y * samp_period;
fft_y(1) = [];
n_fft=length(fft_y);
spec_y = abs(fft_y(1:n_fft/2)); %spectrum generation
nyquist = 1 / (samp_period * 4);
freq = (1:n_fft/2)/(n_fft/2)*nyquist; %frequency scale generation
figure();
plot(freq, spec_y);   % plot of spectrum vs wave number
xlabel('Wavenumber [cm-1]');
ylabel('Intesity [V]');
根据建议,将fft(fft_y)的结果乘以dt=samp_周期,峰值为0.025

在第二个解之后,通过将fft_y除以n_y(y的长度),幅值为0.25

很明显,我做错了什么。感谢您的帮助


谢谢,

你在这里唯一做错的事情就是期望光谱中的峰值为1。根据Parseval的DFT定理,时域信号的能量等于频域信号的能量除以序列N的长度。您可以在示例中检查这一点:

td_energy = sum( abs(y).^2 )
fd_energy = sum( abs(fft_y).^2 )
td_energy - fd_energy / length(y) % won't be exactly zero because you deleted the zero frequency bin.
所以光谱中的峰值并不代表时域中余弦波的振幅,而是它们的能量。还要注意,在这一点上,能量低于你可能期望的,因为你填充了很多零

在实践中,某一频率的平均功率往往更令人感兴趣。考虑下面的代码示例< /P>
t = linspace(-4*pi, 4*pi, 2^16);
N = length(t); % DFT length
y = cos(t); % single cosine wave
y_pow = sum( abs(y).^2 ) / N; % is 0.5
fft_y = fft(y);
fft_y_pow = (sum( abs(fft_y).^2 ) / N) /N; % is 0.5
figure; plot(abs(fft_y)./N);
功率是通过将能量平均为序列N的长度来获得的。如果将频谱除以N,则获得每个频率的平均功率。在上面的示例中,您识别出一个高度为0.5的单峰,它表示振幅为1的单个cos波(因此功率为0.5)


就我个人而言,我更喜欢用
1/sqrt(N)
缩放MATLAB的FFT输出,用
sqrt(N)
缩放其IFFT输出。这样,时域序列和频域序列的能量总是相等的。

这里唯一的错误就是期望频谱中的峰值为1。根据Parseval的DFT定理,时域信号的能量等于频域信号的能量除以序列N的长度。您可以在示例中检查这一点:

td_energy = sum( abs(y).^2 )
fd_energy = sum( abs(fft_y).^2 )
td_energy - fd_energy / length(y) % won't be exactly zero because you deleted the zero frequency bin.
所以光谱中的峰值并不代表时域中余弦波的振幅,而是它们的能量。还要注意,在这一点上,能量低于你可能期望的,因为你填充了很多零

在实践中,某一频率的平均功率往往更令人感兴趣。考虑下面的代码示例< /P>
t = linspace(-4*pi, 4*pi, 2^16);
N = length(t); % DFT length
y = cos(t); % single cosine wave
y_pow = sum( abs(y).^2 ) / N; % is 0.5
fft_y = fft(y);
fft_y_pow = (sum( abs(fft_y).^2 ) / N) /N; % is 0.5
figure; plot(abs(fft_y)./N);
功率是通过将能量平均为序列N的长度来获得的。如果将频谱除以N,则获得每个频率的平均功率。在上面的示例中,您识别出一个高度为0.5的单峰,它表示振幅为1的单个cos波(因此功率为0.5)


就我个人而言,我更喜欢用
1/sqrt(N)
缩放MATLAB的FFT输出,用
sqrt(N)
缩放其IFFT输出。这样,时域和频域序列的能量总是相等的。

如果你想在IFFT输入和输出中获得相同的能量,你必须相乘 sqrt(N)的IFFT输出(时间信号),其中N是变换的大小

代码如下:

对于FFT(将输出除以sqrt(N)),也是这样; 希望能有帮助 费利克斯


TimeEn/Freq

如果您希望IFFT输入和输出中的能量相同,则必须相乘 sqrt(N)的IFFT输出(时间信号),其中N是变换的大小

代码如下:

对于FFT(将输出除以sqrt(N)),也是这样; 希望能有帮助 费利克斯


TimeEn/Freq

通常需要除以FFT中的元素数N,以获得正确的缩放比例,但如果要进行实到复FFT,并且只使用输出的前半部分,也可以考虑系数2。请注意,并非所有FFT实现都以相同的方式处理缩放,但N的因子是最常见的。嘿,Paul,我使用的是Matlab的FFT,在网上它提到这一个不提供任何缩放。现在,在FFT之前,我正在做切趾和零填充,正如建议的那样,这将使FFT中的点数增加约1000,从2^14增加到2^18。通过除以N,峰值为6*10^-3,远低于1。通常需要除以FFT中的元素数N,以获得正确的缩放比例,但如果进行实到复FFT且仅使用输出的前半部分,也可以考虑系数2。请注意,并非所有FFT实现都以相同的方式处理缩放,但N的因子是最常见的。嘿,Paul,我使用的是Matlab的FFT,在网上它提到这一个不提供任何缩放。现在,在FFT之前,我正在做切趾和零填充,正如建议的那样,这将使FFT中的点数增加约1000,从2^14增加到2^18。除以N,峰值为6*10^-3,远低于1。嘿,德维,谢谢你的详细回答。我还是不完全明白。根据多色光源的干涉公式:
I_ac(x)=和(C(v_I)*cos(4*pi*x*v_I))
其中波数v_I在v_min和v_max之间,x是光程差,C(v_I)是波数v_I的强度。在上面的例子中,C(v_i)=1表示所有波数。因此,根据这本书,通过对y进行FFT,我们应该获得光谱分布信息,即每个v_i的C(v_i)。我认为我们需要更多的信息来检查这一点。“光谱分布信息”对我来说是一个模糊的术语。从FFT光谱中,你可以看出一个频率分量与其他频率分量相比有多强。这基本上是对a的模拟,它测量吸收光谱,即多色光源(在本例中,包含3个波数)通过介质后每个波数的强度。在这种情况下,光线不会被吸收,