用Python实现DFT并绘制功率谱

本文介绍了如何使用Python实现离散傅里叶变换(DFT)并绘制功率谱。通过采样定理将连续信号转换为离散时间信号序列,当DFT点数大于等于序列长度时,可以重构频谱。DFT的计算通常采用两层循环实现,而快速傅里叶变换(FFT)则通过优化提高效率。示例中展示了针对特定信号的DFT计算过程,并利用numpy库的FFT进行结果验证,最后比较了两种方法的绘图效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识背景:傅里叶变换可以分为连续傅里叶变化和离散傅里叶变换,分别是FT,FS,DTFT,DTFS。其中DTFT是我们常说的离散时间傅里叶变换,但这种变换并不一定能够由计算机进行处理,因为对于非周期信号来说其谱一般是连续谱,这样就无法由计算机完成了。所以DFT就出现了,我们知道DTFT是以2π为周期的,我们一般只需要取其主值(可以看作取一个完整的周期)进行分析,如果对DTFT在0到2π内均匀尽行采样的话得到的结果就一定是离散的,如果我们的采样是遵循一定规则的那就可以用采样后的谱完整的恢复原信号。

完整的过程是:原信号遵循采样定理采样得到离散时间信号序列,假设其序列长度为n,如果我们的DFT的点数为K,只要K>=n,那么我们就可以完全重构其频谱(也就是要恢复其DTFT的谱),再由恢复的谱就可以恢复出原信号。再到后来对DFT的计算方式进行改进就有了FFT,是按照DFT具有周期性对称性把多点的DFT分为点数最少的DFT来进行计算。

FFT的算法实现比较复杂,我们一般都是调用第三方库中已经实现的通用的FFT,但是DFT这种不关心运算效率的算法实现起来就很简单,无非就是两层循环。
在这里插入图片描述
在这里插入图片描述
外层循环就是对K的遍历,内层循环就是对n的遍历,相乘,求和。
比如我们要对在这里插入图片描述
这样一个信号做DFT,f1=0.1 f2=0.3,实现过程如下:

from math import *
import numpy as np
import matplotlib.pyplot as plt
#懒得导包了,直接全抓进来


def signal(n):
    return (sin(0.2*pi*n+pi/3)+10*sin(0.6*pi*n+pi/4))

#生成WN项
def wn_k(k,n,N):
    return complex(cos(2*pi*n*k/N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值