缩放FFT和IFFT

1158次浏览(最近30天)
里克Rosson
里克Rosson 2011年9月13日
评论道: 肯尼2021年5月14日
当进行快速傅里叶变换(FFT)和/或快速傅里叶反变换(IFFT)时,正确的缩放结果的方法是什么?
1评论
1月
1月 21 2019年1月
庸张 请发表评论要求澄清。标记是用来标记信息,因为它与使用条款相冲突,例如垃圾邮件或粗鲁。

登录评论。

接受的答案

里克Rosson
里克Rosson 2011年9月13日
是否缩放事?
在大多数情况下,伸缩性真的不是那么重要。光谱的整体形状比绝对尺度更重要。
什么约定?
但如果你真的很担心,你可以选择几种不同的约定(见下面的定义):
  1. 发展规模dt对于FFT,并通过Fs的传输线
  2. 发展规模1 / M对于FFT,并通过的传输线
  3. 发展规模1对于FFT,并通过1的传输线
  4. 发展规模1 /√(M)对于FFT,并通过sqrt(米)传输线。
  5. 等等。
根据我的心情和外面是否下雨,我通常会选择选项1或选项2。
定义
这里我假设有一个离散时间信号 x 表示为一个 x N 矩阵, 是样本的数目和 N 为通道的数量。
[M, N] =大小(x);
此外,我假设抽样率为 Fs 我将时间增量定义为
dt = 1 / f;
频率增量为:
dF = f / M;
怎么所有这些公约有什么共同点?
所有这些约定都有一个共同点:两个比例因子的乘积总是 1 .请注意 传输线 函数中包含缩放因子 1 / M 作为计算的一部分,使整体 往返 缩放 1 / M (应该如此)。
HTH。
瑞克
5点评论
Raunaq纳亚尔
Raunaq纳亚尔 在2020年2月20日
如果我在时域按因子(x)缩放执行FFT,然后是IFFT然后按因子(1/x)缩放来恢复信号。我需要注意x的值吗?我问这个是因为在这种情况下,我们会在时域上缩放,所以我认为对于这种特殊情况帕塞瓦尔定理应该成立不管x的值是多少。
换句话说,我下面步骤 - 将按照下列顺序
乘以x缩放——> FFT——> IFFT——>乘以1/x缩放
我还想确认在同一用于通过在频域中x再跟IFFT再接着FFT缩放,然后通过1在频域本身/ X比例。
换句话说,我下面步骤 - 将按照下列顺序
乘以x缩放——> IFFT——> FFT——>乘以1/x缩放
能X承担任何价值,以恢复所提到的情况下,信号?

登录评论。

更多的答案(6)

检波器博士
检波器博士 2012年1月28日
你是对的,如果只需要频谱的形状,缩放是不重要的。然而,如果有必要使频谱中的振幅正确,那么只有一个缩放选项——您的选项#1。为了使Parseval定理成立,时域的能量必须等于频域的能量。下面的例子演示了这一点:
> n = 8;
> dt = 0.1;
> df = 1/(dt*N)
df =
1.25
> a = randn(N,1)
一个=
0.70154
-2.0518
-0.35385
-0.82359
-1.5771
0.50797
0.28198
0.03348
> b = fft(a)*dt
b =
-0.32813
0.10746 + 0.30519我
-0.080365 + 0.075374我
0.34826 + 0.17802我
0.13866
0.34826 - 0.17802我
-0.080365 - 0.075374我
0.10746 - 0.30519我
> energy_a = sum(a.*conj(a) * dt)这里没必要用连词
energy_a =
0.83314
> energy_b = sum(b.*conj(b) * df)%必要在这里使用连词
energy_b =
0.83314
11评论
Raunaq纳亚尔
Raunaq纳亚尔 在2020年2月20日
如果我在时域按因子(x)缩放执行FFT,然后是IFFT然后按因子(1/x)缩放来恢复信号。我需要注意x的值吗?我问这个是因为在这种情况下,我们会在时域上缩放,所以我认为对于这种特殊情况帕塞瓦尔定理应该成立不管x的值是多少。
换句话说,我下面步骤 - 将按照下列顺序
乘以x缩放——> FFT——> IFFT——>乘以1/x缩放
我还想确认在同一用于通过在频域中x再跟IFFT再接着FFT缩放,然后通过1在频域本身/ X比例。
换句话说,我下面步骤 - 将按照下列顺序
乘以x缩放——> IFFT——> FFT——>乘以1/x缩放
能X承担任何价值,以恢复所提到的情况下,信号?

登录评论。


JEROME
JEROME 2017年8月1日
你好
我看过很多与这个问题相关的话题,所以不知道该怎么回答……我希望这能帮助一些人。我可以看到主要有三组人,那些认为不重要的人,那些除以信号点数的人,还有那些除以采样频率的人。首先,对于某些应用,正确的振幅是很重要的。例如,地震的震级是根据频谱的振幅计算出来的。
那么我同意Seis博士的观点,正确的缩放谱的方法是乘以dt。
有人说FFT必须由点的数量划分往往采取正弦波振幅A的例子,希望看到在频谱2个峰,振幅A / 2。然而,这不是傅立叶变换连续正弦波的。傅里叶变换有两个迪拉克。每个峰的值是无限的,集成在频域上是A / 2。因此,对两个峰,我们应该有一个正确缩放的离散频谱的价值
一个/ df / 2 = Npoints * / Fs / 2
Fs是采样频率,df是频率向量的步长。
MATLAB的FFT输出2张图片振幅A * Npoints / 2的等比例缩放频谱的正确的方法是乘以DT = 1 / Fs的fft的。通过Npoints分割突出了,但并不以接近连续信号的频谱的正确因素。
第二点是所述的Parseval方程。我见过很多人说的FFT可以不尊重这种关系或不适用于离散模式。首先,在离散模式,是否应该趋向于连续值。如果无法Npoints啤酒或更小。并且,如果FFT由DT相乘时,输入信号的能量等于光谱的能量。
我经常看到人们用Parseval方程来处理离散信号,这是不正确的
sum(abs(xi).^2) = sum(abs(xi).^2) withX = fft (X)
Parseval关系的正确离散形式是:
总和(abs (xi)。^ 2)* dt =总和(abs (xi)。^ 2)* df
如果正确定义了FFT乘以dt和df,则这种关系是满足的。
此外,还有许多简单的典型傅里叶变换,如指数衰减、三角函数等。你可以模拟时间信号和已知的连续变换,并检查fft*dt是接近连续变换的正确方法。
1评论
亚历克斯·哈
亚历克斯·哈 2020年5月14日
在MATLAB中,你的陈述基本上是正确的(例如 正确的 Parseval定理的离散形式为:
P_avg_TD =总和(abs (x) ^ 2) * dt;
P_avg_FD =总和(abs (X) ^ 2) * df;
提供的傅里叶变换的结果是适当 按比例缩小的 以…的倍数 dt (你的三林集团内) 你可以通过以下方式看到:
在哪里 所以上述方程变为:
左右两边的项相互抵消,你会得到你上面写的“错误的”表达式:
在哪里 被定义为 fft 结果( ).作为参考, 数值的食谱 使用“错误的”定义作为Parseval定理的离散形式,所以不同的定义和惯例可能会造成混淆。
这是一个例子代码显示了正确的傅里叶变换比例与 分析 高斯函数的傅里叶变换的结果。积分的解析解:
清晰;clc;
解析函数:高斯
σ= 1;%高斯的“宽度”
%定义时域函数|f(t)|^2:
fun_t = @(T)EXP(-t ^ 2 /(2 *西格玛^ 2))*缀(EXP(-t ^ 2 /(2 *西格玛^ 2))。)。
%定义分析傅里叶变换F(T),例如的| F(W)| ^ 2
fun_w = @ (w)(σ* sqrt(2 *π))。* exp(-(σ* w)。^ 2/2)。*连接词(......
(σ*√2 * pi)。* exp(-(σ* w)。^ 2/2));
int_t =积分(fun_t、负无穷到正无穷);% P_avg (f(t))
int_w =积分(fun_w、负无穷到正无穷)/(2 *π);(f(w))/2
%%数值示例:高斯
%定义数值信号时域
N = 1e7;%。分域
域名= [-5000 5000];%域来计算f(t)
L = domain(1,2) - domain(1,1);域的%长度(例如[-5e3,+ 5E3])
DT = L / N;步长,dt
t = min(域):dt:马克斯dt(域);%t_n = T_MIN + N * dt的(N = 0,...,N-1)
%定义函数在时域
σ= 1;%高斯的“宽度”
ft_num = exp (- t ^ 2 /(2 *σ^ 2));%F(T),数值
fw_num = fft (ft_num);%F(W),数值(无标度)
%考虑Parseval定理(数值配方,没有dt或df因子)
E1_timedomain =总和(abs (ft_num ^ 2))
E1_freqdomain =总和(abs (fw_num ^ 2)) / N
%考虑Parseval定理(基于“黎曼”一体化)
df = 1 / (N * dt);计算频率步长
fx = fw_num。* dt;%根据DT规模fw_num(重新定义为Fx)
E2_timedomain = dt *总和(abs (ft_num ^ 2))
E2_freqdomain = df *总和(abs (fx ^ 2))减去2*pi的%因子
% FT定义的差异*
我还应该指出,“不正确的”方法满足Parseval定理(例如第一行代码中的P_avg_TD = P_avg_FD), 然而 ,你得到 不正确的 平均功率内容,如E1_timedomain与E2_timedomain的示例代码所示。

登录评论。


Chani
Chani 2015年9月16日
编辑:Chani 2015年9月16日
嗨,大家好,
我尝试了上面提到的两个选项,即选项1和选项2和一个简单的正弦曲线。这两种选择的结果都让我感到困惑,我希望你能帮我弄清楚。
我所指的代码如下:
dt = 0.05;%时间步
t = (0: dt: 10);%时间向量
s =罪(2 *π* t);%信号向量
N =长度(s);%数据点个数
f = 1 / dt;%采样频率
df = f / N;%的频率增加
NFFT = N;用作FFT的第二个参数%FFT长度()
y_option1 = fft(年代,NFFT);%使用采样间隔作为比例因子计算FFT
y_option1 = y_option1 * dt;
y_shiftOption1 = fftshift (y_option1);
y_option2 = fft (s);%计算FFT使用信号的长度的比例因子
y_option2 = y_option2 / N;
y_shiftOption2 = fftshift(y_option2);
如果国防部(N, 2) = = 0%N是偶数
F = -f_s/2: df: f_s/2-df
其他的% N是奇数
F = [sort(-1*(df:df:f_s/2)) (0:df:f_s/2)];
结束
绘制正弦信号和结果向量y_shiftOption1和y_shiftOption2,得到如下图:
在我看来,选项2的结果显示正确的振幅为0.5V,因为时间信号的振幅为1V,这个值在负频标和正频标上被分成两个脉冲。
然而,关于Parseval定理,只有使用选项#1才能保存能量:
总和(abs(年代)。^ 2)* dt = 5
总和(ABS(y_shiftOption1)。^ 2)* DF = 5
总和(abs (y_shiftOption2) ^ 2)。* df = 0.0495
这是否意味着,如果我对信号的实际振幅感兴趣,我必须使用选项2如果我想保留信号的能量选项1必须适用?
提前感谢您的帮助!
顺祝商祺Chani
7评论
肯尼
肯尼 2021年5月14日
你好马提亚。我想我找到了关于-----缩放的答案,当时我不明白它是用来做什么的。但是看起来如果对FFT和IFFT中的一个或两个做了缩放,那么应用于FFT和IFFT的缩放因子需要使它们的乘积等于1/N。如果IFFT没有缩放,而FFT有1/N,缩放因子.....然后没关系。如果IFFT和FFT都乘以1/根号N,那也没问题。在这个链接.....上有一些关于它的讨论 https://www.dsprelated.com/thread/4705/fft-ifft-scaling-revisited 由于马蒂亚斯。

登录评论。


米歇尔·马可尼
米歇尔·马可尼 在2017年10月24日
用matlab计算的fft(没有特别的缩放!)和利用Xilinx模块为SystemGenerator获得的fft,怎么可能有2000x因子缩放的差异?即Xilinx 1的振幅低2000倍?
(关于振幅的问题,我认为这个话题是正确的,对不起,挖坟墓!)
1评论
霍山Fadeel
霍山Fadeel 2019年5月23日
我有一个情况,来自MATLAB FFT的频谱值是Xilinx FPGA FFT的值的两倍,对于相同的输入数据。
我使用MATLAB代码,
clc;
清除所有;
关闭所有;
NFFT = 2048;% NFFT-point DFT
文件标识= fopen(‘Sine2048_test.txt’,‘r’);
A_Data = fscanf(fileID, '%d');% 2048样本点
%%从样品中生成不同频率的正弦
mem_len =长度(A_Data)
Sine0 =[]; %基础频率
Sine1 =[]; %所需频率
指数= 1;
N=32, %为频率乘法器
因为我= 1:mem_len
Sine0 = [Sine0 A_Data(i)];%得到sin值,范围在0.0-1.0
If (index >= mem_len) %|| (index > mem_len) %|
指数= 1;
其他的
Sine1 = [Sine1 A_Data(指数)];
index = index +N;
结束
结束
图;
次要情节(2 2 1);
图(Sine0)
标题(“原始正弦波1hz”)
副区(2,2,2);
图(Sine1)
标题(“高频正弦波(5hz)”)
%%
X_Sine0 = fftshift (fft (Sine0 NFFT));%使用FFT计算DFT
fVals = (-NFFT / 2: NFFT / 2 - 1) / NFFT;% DFT采样点
副区(2,2,3);
%的阴谋(fVals、abs (X_Sine0));
情节(fVals,ABS(X_Sine0));
title('Double - Sided FFT - with FFTShift');
包含(归一化频率)
ylabel (DFT值);
X_Sine1 = fftshift (fft (Sine1 NFFT));%使用FFT计算DFT
fVals = (-NFFT / 2: NFFT / 2 - 1) / NFFT;% DFT采样点
次要情节(2、2、4);
情节(fVals、abs (X_Sine1));
title('Double - Sided FFT - with FFTShift');
包含(归一化频率)
ylabel (DFT值);
%%
图;
次要情节(2,1,1);
图(Sine1)
标题(“高频正弦波(5hz)”)
X_Sine1 = fftshift (fft (Sine1 NFFT));%使用FFT计算DFT
fVals = (-NFFT / 2: NFFT / 2 - 1) / NFFT;% DFT采样点
次要情节(2,1,2);
情节(fVals、abs (X_Sine1));
title('Double - Sided FFT - with FFTShift');
包含(归一化频率)
ylabel (DFT值);
%%
X_Sine1 = fft (Sine1 NFFT) / NFFT;%使用FFT—(/NFFT)尺度因子计算FFT
% fVals = (-NFFT / 2: NFFT / 2 - 1) / (NFFT);% DFT采样点
FFT_imag =图像放大(X_Sine1)”;
FFT_real =现实(X_Sine1)”;
图;
情节(ABS(FFT_imag));
图;
情节(ABS(FFT_real));
图;
情节(abs (X_Sine1));
title('Double - Sided FFT - with FFTShift');
包含(归一化频率)
ylabel (DFT值);
===========
MATLAB的输出-最后一图
振幅是8000
capture.png.
赛灵思FPGA的输出是:
幅度是4000
Capture2.PNG
对此的任何解释都将不胜感激。

登录评论。


RSK
RSK 2018年4月19日
检波器博士
我想在这里和其他地方你们提到了"振幅"这个词,你们指的是乘以dt后的变换的振幅,对吧?(这不是正弦波在那个频率上的振幅并进行变换)然而,如果人们对生成变换的正弦波振幅感兴趣,是否应该使用Chani例子中的选项#2(尽管这不是变换的真实振幅)?如果我有某样东西,例如,机床(为例)以单位幅度以1hz振动,而我看到的是由“选项#1”产生的变换作为测量振动,我当然不应该得出结论,机床正在以“选项#1”显示的振幅振动。所以我想除以N(选项2)会告诉我机床振动的大小。这种理解正确吗?谢谢

布鲁诺陈德良
布鲁诺陈德良 2018年9月21日
编辑:布鲁诺陈德良 2018年9月21日
IMHO,如果输入信号是x(t)是实数,只有大约一半的x(f) = fft(x)(f)是相关的(index 1:ceil((N+1)/2))另一半只是第一部分翻转的共轭,所以Parseval会匹配积分 X (f) ^ 2上[0,1 /(2 * DT)](高达奈奎斯特频率),并通过在FFT(X(t_i))ABOT SQRT(2)DT的顶部的一个额外的因子,以获得的Parseval一个必须乘法平等高达奈奎斯特频率(而不是超出)。
一些微妙的考虑:如果N是偶数,频率单元格((N-1)/2)*df只计数一次,所以它不应该乘以根号2。对于所有情况,静态项(f=0)也是如此。
平方根(2)的一个因数:它可以使桥梁抵抗或倒塌。

下载188bet金宝搏

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!