基于Python的频谱分析(二)——频谱泄露

本文探讨了频谱泄露现象,当使用DFT分析以特定频率fs的正弦序列时,由于时域截断,导致频谱在fs附近而非仅fs处出现谱线。这种现象称为频谱泄露。通过分析含有非整数周期波形的代码,展示频谱泄露导致的能量分散,影响频谱特性计算。解决方案是应用窗函数以改善,内容将在后续博客中进一步阐述。

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

1、频谱泄露

  对于频率为fs的正弦序列,它的频谱应该只是在fs处有离散谱。但是,在利用DFT求它的频谱时,对时域做了截断,结果使信号的频谱不只是在fs处有离散谱,而是在以fs为中心的频带范围内都有谱线出现,它们可以理解为是从fs频率上“泄漏”出去的,这种现象称 为频谱“泄漏”。

2、代码分析

如果我们波形不能在fft_size个取样中形成整数个周期的话会怎样呢?将上篇博客中的采样对象的频率改为:

x = np.sin(2*np.pi*100*t)+2*np.sin(2*np.pi*234.375*t)

import numpy as np#导入一个数据处理模块
import pylab as pl#导入一个绘图模块,matplotlib下的模块

sampling_rate = 8000#采样频率为8000Hz
fft_size = 512 #FFT处理的取样长度
t = np.arange(0, 
日光倾城整理小波变换中能量泄漏问题的研究-仿真图1.doc 本帖最后由 日光傾城 于 2012-3-30 22:49 编辑 【小波分析】 db10的 6层分解 重构的小波能量谱分布 一、案例分析 采用 db10的 6层小波分析,经过分解、重构观察小波能量谱分布情概况。 分析的信号频率为16.7HZ。采样频率1000HZ,采样点N=1024。由于小波分解遵循Nyquist标准,因此最大可测频率为采样频率的一半,即500HZ 对信号进行六层分解,由Mallat多分辨率算法, 频带划分: d1:500--250 d2:250--125 d3:125--62.5 d4:62.5--31.25 d5:31.25--15.625d6:15.625-7.8125a6:7.8125--DC出现问题:1)16.7HZ信号应该落在d5中,但是,能量直方图显示的a6重构的成分更多,即DC--7.8125之间。                   2)原信号改成50HZ和200HZ 靠近频段的中心时,就不会发生这种现象了。 问题原因:小波变换中的能量泄漏问题 解决办法:改变采样频率(或者分解层数N),使感兴趣频率靠近频带中心位置。 未解决问题:由于谐波的存在,16.7HZ的信号会被分解1/2,1,2倍频。基频16.7的幅值比实际幅值有所衰减。这样很难判断风机转速1000r/min,即频率16.7HZ,当出现y=a*sin*16.7) b*sin c*sin ... f*sin的叠加情况时,实际的幅值会与小波分析得到的重构时间序列的幅值有所差别。期待大家能解决这个问题。同样的问题也会出现FFT变换中。例如y=sin,用离散点来描述时,1)离散的点越多,波形趋势越清晰。即采样点越多,频谱泄露越少。                              2)采样频率,必须大于待测信号的2倍(最低标准)。t=时间段内,采样周期T=1,采样频率F=1,可以采集6点。采样频率F=2,可以采集12点。因此,每个周期内采集20个点计算,采样频率选择20*(1/2pi)=3.2HZ.过大的采样长度会影响计算的速度。
### 基于加窗FFT的频谱分析大作业示例 #### 一、实验目的 理解快速傅里叶变换(FFT)的工作原理及其局限性,掌握如何利用窗口函数提高频谱估计的质量。 #### 、理论基础 1. **FFT特性** - FFT提供了一种高效计算离散傅立叶变换(DFT)的方法。然而,在实际应用中存在一些固有的限制条件[^1]。 - 当被测信号不是严格周期性的或者是非整数倍周期截断时,会出现所谓的栅栏效应和泄漏现象; - 这些问题会影响最终得到的频谱图准确性; 2. **加窗技术的作用** - 应用合适的窗户可以减少因突然切断而导致的能量扩散至相邻频率区间内的情况发生,从而提升解析精度[^2]。 3. **带宽概念的重要性** - 数字通信系统中的带宽定义为能够承载的信息量大小,即从零Hz直到最高有用频率之间的宽度[^3]。 4. **IIR滤波器简介** - IIR(Infinite Impulse Response,无穷冲激响应)是一种常见的模拟/数字转换方式之一,其特点在于具有无限长度的单位脉冲响应序列[^4]。 #### 三、实验环境搭建 为了完成本次实验,建议采用Python编程语言配合NumPy库实现核心算法逻辑,并借助Matplotlib绘制图形化界面展示结果。 ```python import numpy as np from scipy import signal import matplotlib.pyplot as plt def generate_signal(frequencies=[50], amplitudes=[1]): """Generate a composite sine wave.""" t = np.linspace(0, 1, 44100, False) sig = sum([amp * np.sin(2*np.pi*freq*t) for freq, amp in zip(frequencies, amplitudes)]) return t, sig def apply_window(signal, window_type='hamming'): """Apply specified type of window to input signal""" win_func = getattr(signal.windows, window_type)(len(signal)) return signal * win_func def plot_spectrum(sig, fs=44100., title="Spectrum"): """Plot the magnitude spectrum using fftshift and abs() functions.""" N = len(sig) f = (np.fft.fftfreq(N)*N).astype(int)*(fs/N) sp = np.abs(np.fft.fft(sig))[:int(N//2)] fig, ax = plt.subplots() ax.plot(f[:int(N//2)], sp) ax.set_xlabel('Frequency [Hz]') ax.set_ylabel('|Amplitude|') ax.grid(True) ax.set_title(title) if __name__ == "__main__": # Generate test signals with different frequencies & amplitudes. _, original_sig = generate_signal(amplitudes=[1]) # Apply Hamming Window before performing FFT analysis. windowed_sig = apply_window(original_sig.copy()) # Plot both spectra side by side for comparison purposes. plt.figure(figsize=(12,6)) plt.subplot(1,2,1);plot_spectrum(original_sig,title="Original Signal Spectrum") plt.subplot(1,2,2);plot_spectrum(windowed_sig,title="Window Applied Signal Spectrum") plt.tight_layout();plt.show() ``` 此段代码实现了如下功能: - 创建了一个由多个正弦波叠加而成的时间域测试信号; - 使用Hamming窗对该原始信号进行了预处理操作; - 分别对未经过任何修饰以及施加过窗口后的两版数据执行了快速傅氏变换运算; - 将所得出的结果可视化出来以便直观对比两者差异之处。 #### 四、结论总结 通过对同一份音频片段分别采取简单直接的方式与引入适当类型的平滑过渡机制两种不同策略下的频谱特征进行比较研究发现:后者确实能够在一定程度上缓解前者可能存在的某些缺陷——比如假峰过多等问题的发生概率明显降低,整体曲线更加光滑自然,更能反映出真实的物理意义所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值