Python中使用numpy对序列进行离散傅里叶变换DFT

本文通过使用Python的numpy库实现离散傅里叶变换(DFT),展示了如何将有效长度为4的单位序列变换为长度16的DFT谱线,以此增加有限长序列的物理分辨率。

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

看了大佬对DFT的介绍后感觉离散傅里叶变换对序列信号的处理还是很有用的,

总结下来就是DFT可以增加有限长序列的长度来提高物理分辨率。

自己用python中的numpy库实现了一下:

其中绘图库的使用请参考:Python绘图

将有效长度为4的单位序列,变换为长度16的DFT谱线。

import numpy as np
import matplotlib.pyplot as plt

a = [1, 1, 1, 1]
print(a)
plt.plot(a)
plt.grid(True)
plt.xlim(0, 15)
plt.show()

dft_a = np.fft.fft(a, 16)
print(dft_a)
plt.plot(dft_a)
plt.grid(True)
plt.xlim(0, 15)
plt.show()

### 离散傅里叶变换DFT原理 离散傅里叶变换(DFT)是一种用于分析有限长度序列的方法,它能够将时域中的信号转换成频域表示形式。对于一个长度为 \( N \) 的离散时间信号 \( x[n] \),其对应的 DFT 定义如下: \[ X[k]=\sum_{n=0}^{N-1}{x[n]\cdot e^{-j2\pi kn/N}} , k = 0, ..., N-1 \] 这里 \( j=\sqrt{-1} \), 表达式中指数项代表旋转因子。 通过上述公式可以计算得到输入序列的各个频率成分及其幅值大小[^1]。 当执行逆离散傅里叶变换(IDFT)时,则是从频域恢复原始的时间序列: \[ x[n]=(1/N)\sum_{k=0}^{N-1}{X[k]\cdot e^{j2\pi nk/N}}, n = 0,...,N−1 \] 这表明傅里叶变换本质上实现了数据从时域到频域之间的相互转化过程[^2]。 另外值得注意的是,在实际操作过程中为了更直观地观察频谱分布情况,通常会做一次频谱平移使得中心位于零频率处即[-π, π]区间内。 ### 应用实例 在工程实践中,DFT有着广泛的应用场景之一便是滤波器设计以及音频处理等领域。比如去除噪声干扰、提取特定声音特征等任务都可以借助该工具完成。具体来说,通过对含有杂音的声音文件实施快速傅立叶变化(FFT算法实现高效版DFT),分离出有用的信息部分后再经由相应的反向运算重建纯净版本。 此外,图像压缩技术JPEG标准也采用了类似的思路来减少冗余信息量从而达到节省存储空间的目的。在此基础上发展起来的小波变换更是进一步拓展了此类方法论的应用范围[^3]。 ```python import numpy as np from matplotlib import pyplot as plt # 创建测试信号 fs = 1000 # Sampling frequency t = np.linspace(0, 1, fs, endpoint=False) frequencies = [50, 120] amplitudes = [0.7, 1] signal = sum([amp * np.sin(2*np.pi*freq*t) for freq, amp in zip(frequencies, amplitudes)]) # 计算并绘制DFT结果 fft_result = np.fft.fft(signal)/len(t) frequency_domain = np.fft.fftfreq(len(t), d=1/fs) plt.figure(figsize=(8,6)) plt.plot(frequency_domain[:int(fs/2)], abs(fft_result)[:int(fs/2)]) plt.title('Magnitude Spectrum') plt.xlabel('Frequency(Hz)') plt.ylabel('|Amplitude|') plt.grid(True) plt.show() ``` 此段代码展示了如何利用 Python 中 `numpy` 和 `matplotlib` 库来进行简单的正弦波合成实验,并对其应用 FFT 来获取频谱图展示效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值