当前位置: 首页 > news >正文

(三) 傅里叶变换:把信号拆成音符的秘密

—— 从“杂乱电流”到“频谱瀑布流”的魔法分解


一、音乐家的启示:如何分离交响乐中的乐器?

想象一段交响乐录音中混杂着小提琴、鼓声和长笛。傅里叶变换就像一个超级耳朵,能将混合信号拆解为独立的频率成分——就像在乐谱上标出每个音符的音高和强度。

核心思想:任何信号都可以表示为不同频率正弦波的叠加。


二、数学显微镜:傅里叶变换公式

1. 离散傅里叶变换(DFT)

将离散信号 x [ n ] x[n] x[n] 转换为频域表示 X [ k ] X[k] X[k]

X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π k n / N ( k = 0 , 1 , . . . , N − 1 ) X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j2\pi kn/N} \quad (k=0,1,...,N-1) X[k]=n=0N1x[n]ej2πkn/N(k=0,1,...,N1)

  • N N N:信号长度
  • X [ k ] X[k] X[k]:第 k k k 个频率分量的复数(包含幅度和相位)

2. 快速傅里叶变换(FFT)

(FFT算法的原理和实现较为复杂,本文暂不展开深入探讨。)

  • FFT是DFT的高效实现(复杂度从 O ( N 2 ) O(N^2) O(N2) 降到 O ( N log ⁡ N ) O(N\log N) O(NlogN))。
  • 为什么重要?:处理1秒音频(44,100点)时,FFT比DFT快约 4,400倍

三、Python实验:用FFT分析鸟鸣声

场景:识别信号中的高频噪声

import numpy as np
from scipy.fft import fft
import matplotlib.pyplot as plt

# 生成含噪声的信号
fs = 500  # 采样率500Hz
t = np.linspace(0, 1, fs)  # 1秒时长
f_clean = 50  # 纯净信号频率50Hz
x_clean = 0.8 * np.sin(2 * np.pi * f_clean * t)
x_noise = 0.2 * np.random.randn(len(t))  # 高斯白噪声
x = x_clean + x_noise  # 合成信号

# 执行FFT
X = fft(x)
freq = np.linspace(0, fs, len(X))  # 频率轴

# 绘制时域和频域图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 5))

# 时域信号
plt.subplot(1, 2, 1)
plt.plot(t, x, label="含噪声信号")
plt.plot(t, x_clean, 'r--', alpha=0.5, label="纯净信号")
plt.xlabel("时间 (秒)")
plt.ylabel("振幅")
plt.title("时域信号")
plt.legend()

# 频域频谱
plt.subplot(1, 2, 2)
plt.plot(freq[:len(X)//2], np.abs(X[:len(X)//2]))  # 只显示正频率部分
plt.axvline(f_clean, color='r', linestyle='--', label="50Hz主成分")
plt.xlabel("频率 (Hz)")
plt.ylabel("能量")
plt.title("频域频谱")
plt.legend()
plt.tight_layout()
plt.show()

运行结果
频谱分析

  • 左图:时域信号看似杂乱无章
  • 右图:频域清晰显示50Hz主成分和宽带噪声

四、关键概念解析

1. 频谱泄露与加窗

  • 问题:信号截断导致频谱能量“泄露”到相邻频段。
  • 解决:使用汉宁窗(Hann Window)平滑信号边缘。
window = np.hanning(len(x))  # 汉宁窗
X_windowed = fft(x * window)  # 加窗后的FFT

2. 频率分辨率

  • 公式 Δ f = f s N \Delta f = \frac{f_s}{N} Δf=Nfs
    • f s = 1000 H z f_s = 1000Hz fs=1000Hz, N = 1000 N = 1000 N=1000,则 Δ f = 1 H z \Delta f = 1Hz Δf=1Hz
  • 矛盾:提高分辨率需要更长的信号时间( T = N / f s T=N/f_s T=N/fs

五、现实世界的应用

  1. 音频均衡器:调整不同频段的增益(如增强低音)
  2. WiFi路由器的OFDM:将数据分配到多个子载波传输
  3. 医学成像:MRI利用频率信息重建人体剖面
  4. 量子计算:Shor算法用FFT加速质因数分解

六、常见误区

  1. “傅里叶变换能分析瞬时频率?”
    • 不能!FFT假设信号在整个时间段内稳定(需用时频分析如小波变换)。
  2. “所有信号都能用正弦波合成?”
    • 是的!但需要无限多个正弦波(傅里叶级数的收敛性)。

动手实验
修改代码中的 f_clean 为80Hz,添加另一个频率成分(如120Hz),观察频谱如何变化。

上一篇 (二) 采样定理:为什么CD音质是44.1kHz?

相关文章:

  • 【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现
  • 邮件发送频率如何根据用户行为动态调整?
  • # 更换手机热点后secureCRT无法连接centOS7系统
  • 入门-C编程基础部分:2、第一个程序
  • 从零开始学习SLAM | 用四元数插值来对齐IMU和图像帧
  • 基于ESP32-S3 蓝牙SDK封装设计
  • 阿里计算机专业面试宝典1
  • javaweb的基础2
  • 【计算机网络】什么是路由?核心概念与实战详解
  • 群晖如何通过外网访问
  • KingbaseES之KDts迁移SQLServer
  • 安徽京准:GPS北斗卫星时空信号安全防护装置(授时)介绍
  • 【Unity笔记】Unity超时检测器开发:支持自定义重试次数与事件触发
  • AIP-231 批量方法:Get
  • 树莓派超全系列教程文档--(24)本地化设置、SSH及配置防火墙
  • 本地mock服务编写
  • 如何优雅地处理 API 版本控制?
  • 滚轮控制目标臂长度调整相机距离
  • CTF--shell
  • 自动驾驶第一性原理
  • 生于1984年,马玥已任辽宁锦州北镇市代市长
  • “两高”司法解释:升档为境外非法提供商业秘密罪的量刑标准
  • 5月1日起,涉外婚姻登记将在上海市16区全面铺开
  • 解放军报社论:谱写新时代双拥工作崭新篇章
  • 福建海警位金门附近海域依法开展常态化执法巡查
  • 世界读书日|阅读在上海