FFT 单面和 Parseval 定理

信息处理 傅里叶变换 解析
2022-02-21 11:29:20

我试图让 Parseval 定理在单边 FFT 上工作。到目前为止,我有这个代码(matlab):

%% ODD
a = [1 2 3 4 5];
A = fft(a);
A1 = abs(A);
A2 = abs([A(1) 2*A(2:3)]); 

Ea=sum(a.^2)
EA1=sum(A1.^2)/5
EA2=sum(A2.^2)/5

%% EVEN
b  = [1 2 3 4 5 6];
B  = fft(b);
B1 = abs(B);
B2 = abs([B(1) 2*B(2:3) B(4)]); 

Eb =sum(b.^2)
EB1=sum(B1.^2)/6
EB2=sum(B2.^2)/6

输出是:

Ea =  55
EA1 =  55
EA2 =  65
Eb =  91
EB1 =  91
EB2 =  107

一侧的缩放是为了保留幅度信息而不是为了计算 Parseval 定理?

1个回答

Parseval 定理说以下关系成立

n=1Na[n]a[n]=1Nk=1NA[k]A[k]
在哪里A[k]离散傅里叶变换a[n], 都假定为长度N(无填充)。这是因为从时域和频域计算的信号能量必须相等。有关此公式如何产生的更多详细信息,请参阅此答案。

如果要计算单侧频谱,则需要丢弃负频率(当信号为真实时,负频率是多余的)。但是,由于这些条目中包含一半能量,因此您需要将剩余 bin 中的能量乘以 2 - DC 和 Nyquist除外我看到你已经正确地认识到奈奎斯特只存在于N是偶数,并且第一个条目是直流分量,无论N- 好的。但是,您将幅度乘以 2(直接在 FFT 之后),而不是能量 - 负频率区间包含能量的一半。

相反,一旦您使用 FFT 算法计算了离散傅立叶变换(您的变量AB),然后我将首先获得信号的能谱密度a[n]使用

ESDa[k]=|A[k]|2=A[k]A[k]
然后从这个向量中丢弃负频率。这样你就可以正确地扔掉一半的能量,你可以自信地将剩余垃圾箱中的能量乘以2.

以下代码说明了这一点:

%% ODD
a = [1 2 3 4 5];
A = fft(a);
ESD_a = A.*conj(A);
ESD_a_onesided = [ESD_a(1) 2*ESD_a(2:3)]; 

E_a_timedomain = sum(a.^2)
E_a_twosided = sum(ESD_a)/5
E_a_onesided = sum(ESD_a_onesided)/5

%% EVEN
b = [1 2 3 4 5 6];
B = fft(b);
ESD_b = B.*conj(B);
ESD_b_onesided = [ESD_b(1) 2*ESD_b(2:3) ESD_b(4)]; 

E_b_timedomain = sum(b.^2)
E_b_twosided = sum(ESD_b)/6
E_b_onesided = sum(ESD_b_onesided)/6

结果是正确的

E_a_timedomain = 55
E_a_twosided = 55
E_a_onesided = 55

E_b_timedomain = 91
E_b_twosided = 91
E_b_onesided = 91

编辑 - - - - - - - - - - - - - -

实际上,能量值5591仅当我们假设信号采集采样周期为Ts=1.

连续信号的信号能量a(t)定义为

Es=+|a(t)|2dt
然后它的采样版本的能量是
Es=n=1N|a[n]|2Ts
您可以看到我们需要考虑信号采样周期才能获得正确的能量。

下面验证 Parseval 定理,如果我们例如在某个其他采样周期收集了信号Ts1

Ts = 0.05; % the sampling period of acquisition
Fs = 1/Ts; % the sampling frequency of the acquisition

%% ODD
a = [1 2 3 4 5];
N = 5

A = fft(a)*Ts;
ESD_a = A.*conj(A);
ESD_a_onesided = [ESD_a(1) 2*ESD_a(2:3)]; 

E_a_timedomain = sum(a.*conj(a))*Ts
E_a_twosided = sum(ESD_a)*Fs/N
E_a_onesided = sum(ESD_a_onesided)*Fs/N

%% EVEN
b = [1 2 3 4 5 6];
N = 6

B = fft(b)*Ts;
ESD_b = B.*conj(B);
ESD_b_onesided = [ESD_b(1) 2*ESD_b(2:3) ESD_b(4)]; 

E_b_timedomain = sum(b.^2)*Ts
E_b_twosided = sum(ESD_b)*Fs/N
E_b_onesided = sum(ESD_b_onesided)*Fs/N

与输出

E_a_timedomain = 2.75 [signal^2 sec]
E_a_twosided   = 2.75 [signal^2 sec]
E_a_onesided   = 2.75 [signal^2 sec]

E_b_timedomain = 4.55 [signal^2 sec]
E_b_twosided   = 4.55 [signal^2 sec]
E_b_onesided   = 4.55 [signal^2 sec]