傅立叶变换前后的能量守恒问题 您所在的位置:网站首页 parseval能量守恒公式二维 傅立叶变换前后的能量守恒问题

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

2024-06-15 03:04| 来源: 网络整理| 查看: 265

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

频域有 64 个频点,我们在第二个频点上发送一个信号,幅度为 1,相位为 ,这个信号可以表示为 . 按照直观的理解,我们发送的信号是:

可以展开为:

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

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

号,即是 0:

总计 64 个.

用下面的 python 代码来做 ifft:

画出来的图形如下:

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

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

在这个例子中,由于只有 ,其它都是 0,上面公式中的求和项,就退化为之后 k=1参与了运算:

公式 2 与 公式 1 比较,则可以看到,公式二 多了一个  ,从图中也可以看到,最高幅值是 .

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

我们先从频域看,64 个频域信号的总能量,是每个频率点上能量的和,即:,这个能量是在一个 fft 对应的时间上的,即 64 个采样点内的。则换算成功率,在频域看到的功率为 :

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

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

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

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

可以看到,频域的能量是 1,而时域的能量是 ,能量相差了 64 倍!

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

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

FFT 变换:

IFFT 变换

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

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

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

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

其能量为(注意:为了与频域保持一致,要注意求和的时间范围是 N 个采样点):

其功率则为 .

那么,如果在频域上,只有一个频率点上有信号,且频域  等于 1,则信号的功率就是 , 则可以根据 SNR 的公式,计算出来需要的噪声的功率。如果 N 个频点上,都有信号,且频域  等于 1,则其功率就是 1.

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

延伸阅读:

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

    傅立叶变换中的   构成一个合格的基向量,而 不是一个基向量,因为其长度是 .

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

第一个向量:

k=0

第二个向量:

k=1

第三个向量:

k=2

。。。。

第 k+1 个向量:

k=k

.....

第 N 个向量:

k=N-1

每个基的模长都为 1:

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

则其模长为 N:

这就不是单位向量了。

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有