如何用Python绘制基于Tanh的锥化函数傅里叶变换图?
如何绘制Tanh锥化函数的傅里叶变换图
首先修正你提供的锥化函数代码中的错误:tanh_taper_inverted函数里的elif N/2 < n < N:语句中,变量n应为x,否则会触发未定义变量的报错。
以下是完整的实现步骤:
1. 导入依赖库
需要用到数学计算、数值处理和绘图的工具库:
import math import numpy as np import matplotlib.pyplot as plt
2. 修正后的锥化函数
def tanh_taper(N, x, c): if x < 0: v = 0.0 elif 0 <= x <= N/2: v = math.tanh(c * x) elif N/2 < x < N: v = math.tanh(-c * x + N * c) else: v = 0.0 return v def tanh_taper_inverted(N, x, c): if x < 0: v = 1.0 elif 0 <= x <= N/2: v = math.tanh(-c * x) + 1.0 elif N/2 < x < N: v = math.tanh(c * x - N * c) + 1.0 else: v = 1.0 return v
3. 生成离散采样数据
设定窗口长度N和锥化陡峭程度参数c,生成对应采样点的函数值:
N = 256 # 窗口的离散采样点数 c = 0.1 # 控制锥化边缘的陡峭程度,值越大边缘越陡 # 生成0到N-1的离散采样位置 x_samples = np.arange(N) # 计算两个锥化函数的采样值数组 taper_vals = np.array([tanh_taper(N, x, c) for x in x_samples]) taper_inv_vals = np.array([tanh_taper_inverted(N, x, c) for x in x_samples])
4. 计算傅里叶变换并处理结果
用FFT计算频域特性,转换为dB幅度谱并截取对称的前半部分:
# 计算FFT并提取幅度 fft_taper = np.fft.fft(taper_vals) fft_taper_amp = np.abs(fft_taper) # 转换为dB(加微小值避免log(0)报错) fft_taper_db = 20 * np.log10(fft_taper_amp + 1e-10) fft_inv_taper = np.fft.fft(taper_inv_vals) fft_inv_taper_amp = np.abs(fft_inv_taper) fft_inv_taper_db = 20 * np.log10(fft_inv_taper_amp + 1e-10) # 生成归一化频率轴,只取前半部分(0到Nyquist频率) freq_axis = np.fft.fftfreq(N)[:N//2] fft_taper_db_half = fft_taper_db[:N//2] fft_inv_taper_db_half = fft_inv_taper_db[:N//2]
5. 绘制频域图
用matplotlib绘制和维基百科风格一致的傅里叶变换幅度谱:
plt.figure(figsize=(12, 6)) # 绘制常规Tanh锥化函数的频域图 plt.subplot(1, 2, 1) plt.plot(freq_axis, fft_taper_db_half) plt.title('Tanh锥化函数傅里叶变换(dB)') plt.xlabel('归一化频率') plt.ylabel('幅度(dB)') plt.grid(True) # 绘制反转Tanh锥化函数的频域图 plt.subplot(1, 2, 2) plt.plot(freq_axis, fft_inv_taper_db_half) plt.title('反转Tanh锥化函数傅里叶变换(dB)') plt.xlabel('归一化频率') plt.ylabel('幅度(dB)') plt.grid(True) plt.tight_layout() plt.show()
额外说明
- 归一化频率范围为0到0.5,对应离散信号的Nyquist频率,是FFT频域图的标准展示方式
- 转换为dB刻度可以更清晰地观察旁瓣的衰减特性,和维基百科中窗函数的频域图风格匹配
- 调整
N(窗口长度)和c(锥化陡峭度)可以观察不同参数对频域特性的影响
内容的提问来源于stack exchange,提问作者Juha P
相关产品推荐
相关产品推荐

