欢迎光临散文网 会员登陆 & 注册

傅立叶变换前后的能量守恒问题

2022-09-04 09:45 作者:乐吧的数学  | 我要投稿

在通信系统的仿真中,我们经常需要根据给定的信噪比(SNR: Signal Noise Ratio),为传输的数据加上"加性高斯白噪声(Additive Guassian White Noise)"。但是,传输前的数据,很多时候考虑的是频域的相位,给定的待传输的数据需要经过傅立叶反变换到时域,在时域增加噪声,然后送给接收模块做性能评估。
(录制的视频:https://www.bilibili.com/video/BV1kP411V7hq/
问题在于:无论是 Matlab 上,还是 Python 的 numpy 库中,快速傅立叶变换和反变换,在变换的前后,都没有保持能量守恒,这为定量地增加噪声制造了一点小困难。本文试图通过简单的 QPSK 为例子,频域分成 64 个频点,经过 ifft (快速傅立叶反变换)变到时域,然后定量地分析能量的变化情况.

频域有 64 个频点,我们在第二个频点上发送一个信号,幅度为 1,相位为 %5Cfrac%7B%5Cpi%7D%7B4%7D,这个信号可以表示为 e%5E%7Bj%5Cfrac%7B%5Cpi%7D%7B4%7D%7D. 按照直观的理解,我们发送的信号是:

e%5E%7Bj%5Cfrac%7B%5Cpi%7D%7B4%7D%7De%5E%7Bj2%5Cpi%5Cfrac%7B1%7D%7B64%7Dn%7D%20%3D%20e%5E%7Bj(2%5Cpi%5Cfrac%7B1%7D%7B64%7Dn%2B%5Cfrac%7B%5Cpi%7D%7B4%7D)%7D%20---------%E5%85%AC%E5%BC%8F%EF%BC%88%201%EF%BC%89


可以展开为:

e%5E%7Bj(2%5Cpi%5Cfrac%7B1%7D%7B64%7Dn%2B%5Cfrac%7B%5Cpi%7D%7B4%7D)%7D%20%3D%20cos(2%5Cpi%5Cfrac%7B1%7D%7B64%7Dn%2B%5Cfrac%7B%5Cpi%7D%7B4%7D)%2Bjsin(2%5Cpi%5Cfrac%7B1%7D%7B64%7Dn%2B%5Cfrac%7B%5Cpi%7D%7B4%7D)


可以很容易地看到,实部的最大值是 1.  那么上面这个信号的功率,就是其模的平方,可以很容易看到,模的平方就是 1, 则其功率是 1.

我们来看一下用 ifft 之后的结果,64 个频点上只有第二个频点上有信号,其它频点上没有信

号,即是 0:

0%EF%BC%8C%20e%5E%7Bj%5Cfrac%7B%5Cpi%7D%7B4%7D%7D%2C0%2C0%2C%5Ccdots%2C0



总计 64 个.

用下面的 python 代码来做 ifft:




画出来的图形如下:


可以看到,幅度的最大值不是 1,程序中打印出来的最大值为 0.015625 ! 为什么呢?我们来观察一下 ifft 的公式:

x(n)%20%3D%20%5Cfrac%7B1%7D%7BN%7D%5Csum_%7Bk%3D0%7D%5E%7BN-1%7DX(k)e%5E%7Bj2%5Cpi%5Cfrac%7Bk%7D%7BN%7Dn%7D


其中 $N$ 是傅立叶反变换的长度。这个例子中,N=64.

x(n)%20%3D%20%5Cfrac%7B1%7D%7B64%7D%5Csum_%7Bk%3D0%7D%5E%7B63%7DX(k)e%5E%7Bj2%5Cpi%5Cfrac%7Bk%7D%7B64%7Dn%7D


在这个例子中,由于只有 X%5B1%5D%3De%5E%7Bj%5Cfrac%7B%5Cpi%7D%7B4%7D%7D,其它都是 0,上面公式中的求和项,就退化为之后 k=1参与了运算:

x(n)%20%3D%20%5Cfrac%7B1%7D%7B64%7DX(1)e%5E%7Bj2%5Cpi%5Cfrac%7B1%7D%7B64%7Dn%7D%20--------------%E5%85%AC%E5%BC%8F%202


公式 2 与 公式 1 比较,则可以看到,公式二 多了一个 %5Cfrac%7B1%7D%7B64%7D ,从图中也可以看到,最高幅值是 %5Cfrac%7B1%7D%7B64%7D%3D0.015625.



讨论到这里,似乎问题已经解决了,但是,仔细看看, ifft 变换后幅度变为原来设想的 64 分之一,那能量在转换前和转换后,是否保持一致呢?我们需要的是保持一致。



我们先从频域看,64 个频域信号的总能量,是每个频率点上能量的和,即:%5Csum_%7Bk%3D0%7D%5E%7Bk%3D63%7D%7CX(k)%7C%5E2,这个能量是在一个 fft 对应的时间上的,即 64 个采样点内的。则换算成功率,在频域看到的功率为 :

%5Cfrac%7B%5Csum_%7Bk%3D0%7D%5E%7Bk%3D63%7D%7CX(k)%7C%5E2%7D%7B64%7D


我们只分析一个频点,k=1,在频域看,其能量为 1,这是 k=1这个频率在一个fft对应时间内的能量。

 现在看matlab 和 python numpy 库中 ifft 的变换公式:

x(n)%20%3D%20%5Cfrac%7B1%7D%7B64%7D%5Csum_%7Bk%3D0%7D%5E%7B63%7DX(k)e%5E%7Bj2%5Cpi%5Cfrac%7Bk%7D%7B64%7Dn%7D%3D%5Csum_%7Bk%3D0%7D%5E%7B63%7DX(k)%5Cfrac%7Be%5E%7Bj2%5Cpi%5Cfrac%7Bk%7D%7B64%7Dn%7D%7D%7B64%7D


那么,k=1 对应的波形是:

%5Cfrac%7Be%5E%7Bj2%5Cpi%5Cfrac%7Bk%7D%7B64%7Dn%7D%7D%7B64%7D


那么,我们在 64个样点内计算一下能量:

%5Csum_%7Bn%3D0%7D%5E%7B63%7D%7C%5Cfrac%7Be%5E%7Bj2%5Cpi%5Cfrac%7Bk%7D%7B64%7Dn%7D%7D%7B64%7D%7C%5E2%3D%5Csum_%7Bn%3D0%7D%5E%7B63%7D%7C%5Cfrac%7B1%7D%7B64%7D%7C%5E2%3D%5Cfrac%7B1%7D%7B64%7D


可以看到,频域的能量是 1,而时域的能量是 %5Cfrac%7B1%7D%7B64%7D,能量相差了 64 倍!

所以, ifft 变换,会导致能量降为转换前的 64 分之一。同理,可以证明, fft 变换,会导致能量放大为变换前的64倍。

如果我们把傅立叶变换对的公式,稍微改变一下放大或者缩小的倍数,则可以保证转换前后的能量保持一致,即能量守恒:

FFT 变换:

X%5Bk%5D%20%3D%20%5Csum_%7Bn%3D0%7D%5E%7BN-1%7Dx(n)e%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D%20%3D%3D%3D%E5%8F%98%E4%B8%BA%3D%3D%3D%3D%3D%3E%0AX%5Bk%5D%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7BN%7D%7D%20%5Csum_%7Bn%3D0%7D%5E%7BN-1%7Dx(n)e%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D


IFFT 变换

x%5Bn%5D%20%3D%20%5Cfrac%7B1%7D%7BN%7D%20%5Csum_%7Bk%3D0%7D%5E%7BN-1%7DX(k)e%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D%20%3D%3D%3D%E5%8F%98%E4%B8%BA%3D%3D%3D%3D%3D%3E%0Ax%5Bn%5D%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7BN%7D%7D%20%5Csum_%7Bk%3D0%7D%5E%7BN-1%7DX(k)e%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D


使用上面修改过的公式,则可以保证能量前后保持一致。

有时候,我们不仅关心能量保持一致,还要关心这个信号的能量大小,例如我们为了加入一定信噪比 SNR 的高斯白噪声,需要知道信号的功率大小。

注意:后面讨论的能量大小,功率大小,都是基于修改后的傅立叶变换的公式,即保证变换前后能量保持一致的。

在频域看,一个频率点的信号,假设其能量为 1 (一般情况下,例如 QPSK 调制,都是保持能量为 1 的),因为傅立叶反变换后,对应到 N 个采样点的时间,因此,其功率为: %5Cfrac%7B1%7D%7BN%7D.
 
在时域看,其对应的波形为 :

%5Cfrac%7Be%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D%7D%7B%5Csqrt%20N%7D


其能量为(注意:为了与频域保持一致,要注意求和的时间范围是 N 个采样点):
%5Csum_%7Bn%3D0%7D%5E%7BN-1%7D%7C%5Cfrac%7Be%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D%7D%7B%5Csqrt%20N%7D%7C%5E2%20%3D%201


其功率则为 %20%5Cfrac%7B1%7D%7BN%7D .



那么,如果在频域上,只有一个频率点上有信号,且频域 %7CX(k)%7C%5E2 等于 1,则信号的功率就是 %5Cfrac%7B1%7D%7BN%7D, 则可以根据 SNR 的公式,计算出来需要的噪声的功率。如果 N 个频点上,都有信号,且频域 %7CX(k)%7C%5E2 等于 1,则其功率就是 1.


总结一下:本文的核心,是提醒注意用标准库中的 FFT/IFFT 函数时,存在能量在变换前后不守恒的问题。



延伸阅读:

    把傅立叶变换和反变换,看成是线性空间的向量,在坐标轴上的坐标,坐标轴就是线性空间的基,这些基的要求,除了要求任何两个不相同的基之间是正交的,还需要每个基向量的长度为1.

    傅立叶变换中的  %5C%7B%5Cfrac%7Be%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D%7D%7B%5Csqrt%20N%7D%2Cn%3D0%2C1%2C2%2C...N-1%5C%7D 构成一个合格的基向量,而 e%5E%7B-j2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7Dn%7D不是一个基向量,因为其长度是 %5Csqrt%20N.


我们来看一下傅里叶变换中基里面的各个向量(按照正确的方式来列举的):

第一个向量:

k=0

%5B%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B0%7D%7BN%7D0%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B0%7D%7BN%7D1%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cdots%2C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B0%7D%7BN%7D(N-1)%7D%7D%7B%5Csqrt%20N%7D%5D


第二个向量:

k=1

%5B%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B1%7D%7BN%7D0%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B1%7D%7BN%7D1%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cdots%2C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B1%7D%7BN%7D(N-1)%7D%7D%7B%5Csqrt%20N%7D%5D



第三个向量:

k=2

%5B%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B2%7D%7BN%7D0%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B2%7D%7BN%7D1%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cdots%2C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7B2%7D%7BN%7D(N-1)%7D%7D%7B%5Csqrt%20N%7D%5D

。。。。



第 k+1 个向量:

k=k

%5B%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D0%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D1%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cdots%2C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D(N-1)%7D%7D%7B%5Csqrt%20N%7D%5D.....



第 N 个向量:

k=N-1

%5B%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7BN-1%7D%7BN%7D0%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7BN-1%7D%7BN%7D1%7D%7D%7B%5Csqrt%20N%7D%EF%BC%8C%5Cdots%2C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7BN-1%7D%7BN%7D(N-1)%7D%7D%7B%5Csqrt%20N%7D%5D

每个基的模长都为 1:

%7C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D0%7D%7D%7B%5Csqrt%20N%7D%7C%5E2%20%2B%20%7C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D1%7D%7D%7B%5Csqrt%20N%7D%7C%5E2%2B%5Cdots%2B%7C%5Cfrac%7Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D(N-1)%7D%7D%7B%5Csqrt%20N%7D%7C%5E2%20%3D%201


如果用 matlab 中 傅立叶变换的公式,一个向量是:

%5Be%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D0%7D%EF%BC%8Ce%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D1%7D%EF%BC%8C%5Cdots%2Ce%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D(N-1)%7D%5D


则其模长为 N:

%7Ce%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D0%7D%7C%5E2%20%2B%20%7Ce%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D1%7D%7C%5E2%2B%5Cdots%2B%7Ce%5E%7Bj2%5Cpi%20%5Cfrac%7Bk%7D%7BN%7D(N-1)%7D%7C%5E2%20%3D%20N


这就不是单位向量了。




======= 感谢阅读到此处:

塑料垃圾危害多,至少不能让塑料垃圾流进河


傅立叶变换前后的能量守恒问题的评论 (共 条)

分享到微博请遵守国家法律