深入解析:SciPy傅里叶变换与信号处理教程:数学原理与Python实现

news/2025/11/7 20:33:00/文章来源:https://www.cnblogs.com/yangykaifa/p/19200825

SciPy傅里叶变换与信号处理教程:数学原理与Python实现

傅里叶变换(Fourier Transform)是信号处理、科学计算和数据分析中最为核心的数学工具之一。它通过将信号从时域(time domain)转换至频域(frequency domain),揭示出信号内部所包含的周期成分和频率特征。在实际工程中,无论是语音信号处理、图像分析,还是物理实验数据的频谱分析,傅里叶变换都是理解与操作信号的关键手段。

本文将系统介绍傅里叶变换的基本概念与数学原理,并结合 SciPy 库展示其在 Python 中的具体实现。内容涵盖离散傅里叶变换(DFT)及快速算法 FFT、窗函数抑制频谱泄漏、实值序列优化方法(rFFT 与 irFFT)、二维信号处理(2D-FFT),以及离散余弦变换(DCT)在信号压缩中的应用。文中所有可视化均采用 Seaborn 风格进行美化,以增强图形的可读性与展示效果。


1. 从时域到频域:傅里叶变换的基本思想

我们常见的时域信号 x(t)x(t)x(t) 往往包含不同频率的周期分量。傅里叶变换的核心思想是:任意复杂的信号都可以分解为一系列正弦波与余弦波的叠加。其数学定义为
X(f)=∫−∞+∞x(t)e−j2πftdtX(f) = \int_{-\infty}^{+\infty} x(t) e^{-j 2 \pi f t} dt X(f)=+x(t)ej2πftdt
而逆变换为:
x(t)=∫−∞+∞X(f)ej2πftdf x(t) = \int_{-\infty}^{+\infty} X(f) e^{j 2 \pi f t} df x(t)=+X(f)ej2πftdf
在实际计算机环境中,我们处理的多为离散信号。此时应使用 离散傅里叶变换(DFT) 或其高效实现形式——快速傅里叶变换(FFT)。这两者是理解数字信号频谱特征的基础。


2. 离散傅里叶变换(DFT)与快速傅里叶变换(FFT)

离散信号 x[n]x[n]x[n],长度为 NNN,其傅里叶变换可表示为:
X[k]=∑n=0N−1x[n]e−i2πNkn,k=0,1,…,N−1 X[k] = \sum_{n=0}^{N-1} x[n] e^{-i \frac{2\pi}{N} k n}, \quad k=0,1,\dots,N-1 X[k]=n=0N1x[n]eiN2πkn,k=0,1,,N1
逆变换则为:
x[n]=1N∑k=0N−1X[k]ei2πNkn x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} k n} x[n]=N1k=0N1X[k]eiN2πkn
下面通过 Python 实例展示 FFT 的时域与频域表现。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.fft import fft
sns.set_theme(style="whitegrid", font="SimHei", rc={"axes.unicode_minus": False})
# 生成信号
fs = 150
t = np.arange(0, 1.0, 1/fs)
x = np.sin(np.pi*50*t) + 0.5*np.sin(np.pi*120*t)
# FFT
X = fft(x)
freqs = np.fft.fftfreq(len(t), 1/fs)
# 时域信号
plt.figure(figsize=(12,4))
sns.lineplot(x=t, y=x, color="dodgerblue", linewidth=2)
plt.title("时域信号", fontsize=16)
plt.xlabel("时间 (s)")
plt.ylabel("幅值")
plt.show()

在这里插入图片描述

上图展示了时域下的复合正弦信号。我们可以进一步通过频谱图观察各频率分量的能量分布:

# 频域信号幅值
plt.figure(figsize=(12,4))
sns.lineplot(x=freqs[:len(freqs)//2], y=2/len(t)*np.abs(X[:len(X)//2]), color="orangered", linewidth=2)
plt.title("频域信号幅值谱", fontsize=16)
plt.xlabel("频率 (Hz)")
plt.ylabel("幅值")
plt.show()

在这里插入图片描述

频域图直观反映了信号主要的频率成分,峰值对应于正弦波的基频与谐波位置。


3. 窗函数与频谱泄漏

由于实际信号往往被截断为有限长度,直接进行傅里叶变换会产生频谱泄漏现象。此时,频域中的能量会从主频扩散到邻近频率区域,使得频谱不够清晰。

设信号应用窗函数 w[n]w[n]w[n] 后为:
xw[n]=x[n]⋅w[n],w[n]={1,0≤n<N0,otherwise x_w[n] = x[n] \cdot w[n], \quad w[n] = \begin{cases} 1, & 0 \le n < N \\ 0, & \text{otherwise} \end{cases} xw[n]=x[n]w[n],w[n]={1,0,0n<Notherwise

对应的频域卷积为:
Xw(ω)=X(ω)∗W(ω) X_w(\omega) = X(\omega) * W(\omega) Xw(ω)=X(ω)W(ω)
为了减少泄漏,我们可使用平滑窗函数,如 Blackman 窗。下例展示了其效果:

from scipy.signal.windows import blackman
from scipy.fft import fft
N = len(x)
w = blackman(N)
Xw = fft(x*w)
mask = freqs >= 0
plt.figure(figsize=(12,4))
sns.lineplot(x=freqs[mask], y=2.0/N*np.abs(X[mask]), label='无窗FFT', color="dodgerblue", linewidth=2)
sns.lineplot(x=freqs[mask], y=2.0/N*np.abs(Xw[mask]), label='Blackman窗FFT', color="orangered", linewidth=2)
plt.title("窗函数对频谱泄漏的影响", fontsize=16)
plt.xlabel("频率 (Hz)")
plt.ylabel("幅值")
plt.legend()
plt.show()

在这里插入图片描述


4. 实值序列优化:rfft 与 irfft

对于实值信号,其负频率部分是正频率的复共轭,因此在计算时仅需保留一半频率区间即可,从而减少一半运算量。
其数学形式为:
Xr[k]=∑n=0N−1x[n]e−i2πkn/N,k=0,…,N/2 X_r[k] = \sum_{n=0}^{N-1} x[n] e^{-i 2\pi k n / N}, \quad k=0,\dots,N/2 Xr[k]=n=0N1x[n]ei2πkn/N,k=0,,N/2

以下示例展示了使用 rfftirfft 的信号变换与恢复过程:

from scipy.fft import rfft, irfft
Xr = rfft(x)
x_rec = irfft(Xr, n=len(x))
plt.figure(figsize=(12,4))
sns.lineplot(x=t, y=x, color="dodgerblue", linewidth=3, alpha=0.8, label="原信号")
sns.lineplot(x=t, y=x_rec, color="orangered", linestyle="--", linewidth=1.2, label="rFFT恢复信号")
plt.title("实值序列 rFFT 与逆变换", fontsize=16)
plt.xlabel("时间 (s)")
plt.ylabel("幅值")
plt.legend(loc="upper right")
plt.show()

在这里插入图片描述

从结果可见,rFFT 的逆变换几乎完美重建原始信号,这种优化在处理大量实值数据(如声音或传感器信号)时尤为高效。


5. 二维傅里叶变换(2-D DFT)与图像处理

在图像处理中,二维傅里叶变换(2D-FFT)常用于边缘检测、滤波和特征提取。其数学定义如下:
X[k,l]=∑m=0M−1∑n=0N−1x[m,n]e−i2π(km/M+ln/N) X[k,l] = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} x[m,n] e^{-i 2 \pi (k m / M + l n / N)} X[k,l]=m=0M1n=0N1x[m,n]ei2π(km/M+ln/N)

逆变换为:

x[m,n]=1MN∑k=0M−1∑l=0N−1X[k,l]ei2π(km/M+ln/N) x[m,n] = \frac{1}{MN} \sum_{k=0}^{M-1} \sum_{l=0}^{N-1} X[k,l] e^{i 2 \pi (k m / M + l n / N)} x[m,n]=MN1k=0M1l=0N1X[k,l]ei2π(km/M+ln/N)

下面的 Python 示例展示了二维信号(图像)的频谱分析与可视化:

import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft2, ifft2, fftshift
# 参数设置
M, N = 64, 64
x_vals = np.linspace(0, 1, M)
y_vals = np.linspace(0, 1, N)
X, Y = np.meshgrid(x_vals, y_vals)
# 构造二维信号(图像)
img = np.sin(45 * 2 * np.pi * X) + np.sin(20 * 2 * np.pi * Y)
# 傅里叶变换
F = fft2(img)
F_shifted = fftshift(F)  # 频谱居中
# 幅度谱 & 相位谱
magnitude_spectrum = np.log1p(np.abs(F_shifted))
phase_spectrum = np.angle(F_shifted)
# 可视化:原始图像 + 幅度谱 + 相位谱
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
axes[0].imshow(img, cmap="gray")
axes[0].set_title("原始图像")
axes[0].axis("off")
im1 = axes[1].imshow(magnitude_spectrum, cmap="viridis")
axes[1].set_title("幅度谱 (对数尺度)")
axes[1].axis("off")
fig.colorbar(im1, ax=axes[1], fraction=0.046, pad=0.04)
im2 = axes[2].imshow(phase_spectrum, cmap="twilight")
axes[2].set_title("相位谱")
axes[2].axis("off")
fig.colorbar(im2, ax=axes[2], fraction=0.046, pad=0.04)
plt.show()

在这里插入图片描述

通过观察幅度谱可以识别出主要频率方向,而相位谱则记录了结构与位置等信息。这种方法在图像增强与特征分析中十分常用。

左图:原始二维信号(灰度表示),可见水平和垂直的正弦纹理。

中图:幅度谱对数显示,峰值代表图像中主要频率方向。

右图:相位谱,记录了图像结构和位置信息,决定图像形状。

# 频谱切片 (取中心横向 & 纵向)
center_x = M // 2
center_y = N // 2
horizontal_slice = magnitude_spectrum[center_y, :]
vertical_slice = magnitude_spectrum[:, center_x]
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].plot(horizontal_slice, color="steelblue")
axes[0].set_title("频谱横向切片 (中间行)")
axes[0].set_xlabel("频率索引")
axes[0].set_ylabel("幅度 (log)")
axes[1].plot(vertical_slice, color="darkorange")
axes[1].set_title("频谱纵向切片 (中间列)")
axes[1].set_xlabel("频率索引")
axes[1].set_ylabel("幅度 (log)")
plt.tight_layout()
plt.show()

在这里插入图片描述

  • 横向切片展示图像在水平方向的频率分布,高峰表示主要的水平频率成分。
  • 纵向切片展示垂直方向的频率分布,高峰对应主要垂直纹理。

通过逆二维傅里叶变换,可以从频域信息重建原图:

# 逆变换恢复图像
img_rec = np.real(ifft2(F))
plt.figure(figsize=(6, 6))
plt.imshow(img_rec, cmap="gray")
plt.title("逆变换恢复图像")
plt.axis("off")
plt.show()

在这里插入图片描述

重建图像几乎与原始图像一致,说明 FFT 与 IFFT 可以完整地保存图像信息。

幅度谱决定图像能量分布,而相位谱决定图像结构和位置。


6. 离散余弦变换(DCT)及信号压缩

在信号处理与数据压缩中,离散余弦变换(Discrete Cosine Transform, DCT)是一种极为重要的能量压缩变换。与离散傅里叶变换(DFT)不同,DCT 仅使用实数余弦基函数,因此在保持主要信号能量的同时,能有效降低计算复杂度。

DCT 的数学定义为:

X[k]=∑n=0N−1x[n]cos⁡[πN(n+0.5)k],k=0,1,…,N−1 X[k] = \sum_{n=0}^{N-1} x[n] \cos\Big[\frac{\pi}{N} (n + 0.5) k \Big], \quad k=0,1,\dots,N-1 X[k]=n=0N1x[n]cos[Nπ(n+0.5)k],k=0,1,,N1
逆变换(IDCT)为:
x[n]=12X[0]+∑k=1N−1X[k]cos⁡[πNk(n+0.5)] x[n] = \frac{1}{2} X[0] + \sum_{k=1}^{N-1} X[k] \cos\Big[\frac{\pi}{N} k (n + 0.5)\Big] x[n]=21X[0]+k=1N1X[k]cos[Nπk(n+0.5)]

这种变换具有良好的能量集中特性,大多数自然信号的主要能量会集中在前几个系数上,因此可以截断高频分量以实现压缩。

from scipy.fft import dct, idct
X_dct = dct(x, type=2, norm='ortho')
X_compressed = X_dct.copy()
X_compressed[int(0.5*len(X_dct)):] = 0  # 压缩:保留前50%
x_rec = idct(X_compressed, type=2, norm='ortho')
plt.figure(figsize=(12,4))
sns.lineplot(x=t, y=x, color="dodgerblue", linewidth=2, label="原信号")
sns.lineplot(x=t, y=x_rec, color="orangered", linestyle="--", linewidth=2, label="DCT压缩恢复信号")
plt.title("DCT压缩效果", fontsize=16)
plt.xlabel("时间 (s)")
plt.ylabel("幅值")
plt.legend(loc="upper right")
plt.show()

在这里插入图片描述

上图展示了信号在经过 DCT 压缩后再通过 IDCT 逆变换恢复的结果。可以观察到,尽管高频分量被舍弃,信号的主要形状与幅值仍得以保留。

为了更直观地观察能量的集中分布,我们绘制 DCT 系数的能量谱。大部分能量集中在低频部分,这正是 DCT 在压缩应用中的关键优势。

plt.figure(figsize=(12,4))
sns.lineplot(x=np.arange(len(X_dct)), y=np.abs(X_dct), color="purple", linewidth=2)
plt.title("DCT 系数能量分布", fontsize=16)
plt.xlabel("系数索引", fontsize=12)
plt.ylabel("幅值", fontsize=12)
plt.show()

在这里插入图片描述


7. 总结

傅里叶变换及其扩展方法(FFT、rFFT、2D-FFT、DCT)是信号分析与处理的核心工具。
通过掌握其数学原理和 SciPy 实现,你可以在一维信号、实值序列以及二维图像中高效完成频域分析、频谱优化、信号重建与压缩处理。窗函数可抑制频谱泄漏,rFFT 提升实值信号计算效率,二维傅里叶变换揭示图像的幅度与相位特征,而 DCT 则实现高效能量压缩。
综合运用这些方法,既能深入理解信号本质,也能为科学计算和工程实践提供高效可靠的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS Stream 9编译安装Nginx 1.28 - Leone

安装Nginx基本依赖:yum -y install gcc pcre2-devel zlib-devel openssl-devel cd /mnt/wgetwget https://nginx.org/download/nginx-1.28.0.tar.gztar -xvf nginx-1.28.0.tar.gz && cd nginx-1.28.0./config…

SQL核心语言详解:DQL、DML、DDL、DCL从入门到实践! - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ubuntu安装JDK与Maven和IntelliJ IDEA - 详解

Ubuntu安装JDK与Maven和IntelliJ IDEA - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

JavaWeb03-Vue

JavaWeb03-VueVue 什么是VueVue是一款用于构建用户界面的渐进式的JavaScript框架。(http://cn.vuejs.org/)构建用户界面渐进式框架:就是一套完整的项目解决方案,用于快速构建项目优点:大大提升前端项目的开发效率…

【完结】Weblogic中间件应用服务器

【完结】Weblogic中间件应用服务器 学习地址:……/s/1FP9WOZ9FXcNRJTkaEApaVA 提取码:o2rh 在当今瞬息万变的数字商业世界中,企业应用的稳定性、安全性与高可用性已成为支撑业务运转的生命线。在这条无形的战线上,…

调整包含特定文本的单元格所在的行高

Sub 调整包含特定文本的单元格所在的行高()For i = 1 To Range("a" & 1048576).End(xlUp).RowIf Range("a" & i).Value Like "健康管理意见建议*" ThenRange("a" &am…

javabean和pojo的区别

JavaBean 是一种JAVA语言写成的可重用组件。 它的方法命名,构造及行为必须符合特定的约定:这个类必须有一个公共的缺省构造函数。 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。 这个类应是可序…

一次十分折腾的系统迁移:BCD损坏(0xc000000f), 0xc0000255, 0xc000000e以及解决办法

起因:原装盘内存不够(matebook13原装256G,我用了五六年了,80G传奇c盘使我的所有朋友难绷),想着自己换一块512G的 两块都是WD的盘,兼容没问题 盲目信任自己的技术力和Qwen3的能力,于是开始快乐的装盘过程~ 期间…

2025微信小店代运营/电商优质服务商推荐榜:健安道领衔,三大实力机构助力商家全域增长

2025 年微信电商生态持续扩容,微信小店凭借公私域联动优势实现 GMV 同比激增 192%,成为商家线上布局的核心阵地。本次推荐聚焦真实靠谱的微信小店服务商,精选 3 家实力企业,为品牌提供清晰的合作参考。 健安道企业…

知识树

1 (重点)dp 1.1 常规 dp 1.1.1 选择 dp 主体,缩减状态 1.1.2 前缀和/差分(包括高阶)优化 1.1.3 改变转移顺序 1.1.4 贡献特殊处理 1.2 特殊结构上 dp 1.2.1 树形 dp树上背包 连通块问题 长剖优化 dp 虚树 dp1.2.2…

2025昆山/太仓/苏州/常熟/上海/农村自建房推荐榜 巨德翔建筑领衔 三家实力公司赋能乡村宜居生活

随着长三角地区乡村居住需求升级,自建房因个性化、实用性成为众多家庭的选择。为方便昆山、太仓、苏州、常熟、上海等地用户挑选靠谱服务商,整理 2025 自建房推荐榜,聚焦口碑企业,为居住升级提供参考。 一、昆山巨…

深入解析:ST-Raptor:无需微调,准确率超越 GPT-4o 的半结构化表格问答新范式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025苏州自建房/阳光房/封阳台/瑞纳斯/海达胶条/高端/推拉/无缝焊接/瑞纳斯五金/隔热/系统门窗品质推荐榜:昆山巨德翔门窗领衔,3 家靠谱厂家守护舒适居住空间

在居住品质升级的当下,系统门窗作为家居核心部件,其隔音隔热、安全耐用等性能直接影响生活体验。2025 年,苏州及周边地区涌现出一批专注品质的系统门窗服务商,本次推荐榜精选 3 家口碑过硬、服务贴心的企业,为有需…

2025北京一对一辅导/补习/培训/家教/网课推荐榜:金博教育领衔,3家优质机构凭个性化服务出圈,适配多元学习需求

在北京的学习提升场景中,北京一对一辅导、北京一对一补习、北京一对一培训已成为学子精准补弱、高效提分的重要选择。2025 年,市场上深耕教学品质与服务体验的机构脱颖而出,本次推荐榜聚焦真实办学实力与口碑,精选…

2025河南卫校推荐榜:漯河卫生中等专业学校领衔,周口 / 郑州优质中专学校盘点,适配漯河 / 南阳 / 信阳等多地学子选择

在河南漯河、周口、郑州、南阳等多地,优质卫校与中专学校成为众多学子的重要选择。为帮助大家精准挑选,本文整理 2025 年口碑出众的 3 所卫生类中专学校,所有推荐均基于真实办学情况,无营销导向,供漯河、驻马店、…

树上拓扑序个数小记

树上拓扑序个数小记 给定一棵有根外向树,要求对拓扑序个数计数。 设 \(f(x)\) 表示子树 \(x\) 的拓扑序个数,容易写出以下转移(先确定每个子树的拓扑序,再将它们分配): \[f(x)= (sz_x-1)!\prod_{v\in son(x)} \d…

2025修护/去屑/香氛/控油蓬松/洗发水推荐榜:玛丝兰领衔,三款品牌解锁高效洗护,温和适配多发质

在洗护需求日益精细化的 2025 年,修护受损发丝、精准去屑、长效留香成为大众核心诉求。本次推荐聚焦三款真实可靠的洗发水品牌,以成分安全、功效务实为筛选标准,其中玛丝兰凭借全场景覆盖优势登顶五星推荐,另有两款…

2023最新Win10/Win11运行罪恶都市解决方案

心血来潮想玩一玩很久之前的游戏《侠盗猎车手罪恶都市》,游戏来源为Steam正版,下载安装运行后发现一直报错玩不了,当时报错忘记截图了只记得这串错误信息:Unhandled Exception:c0000005,网上找了好久资料四处收集…

Typecho Joe 使用第三方插件开启文章侧边导肮目录 - AutocJS

原作者博客:https://www.ydyno.com 原文章地址:https://www.ydyno.com/archives/1331.html 开源项目地址:https://github.com/yaohaixiao/outline.js 原作者非常给力,解决了Typecho的一个痛点:没有导航目录,这里…

2025废气处理/废气治理/环保/污水/分子筛/除臭设备推荐榜:深城环保五星领跑,3 家企业以技术适配解锁多元异味治理场景

2025年环保治理需求持续升级,除臭设备尤其是分子筛除臭设备因高效低耗成为行业刚需。本次推荐榜基于技术实力、落地案例与行业口碑筛选,聚焦真实服务能力,为不同场景异味治理提供参考。 上海深城环保设备工程有限公…