快速傅里叶变换

这是一个 Python 代码示例,使用 numpy 和 matplotlib 库生成和处理正弦波和余弦波。代码的目的是生成四个正弦和余弦波,将它们相加以获得混合信号,然后计算信号的傅里叶系数,并对振幅频谱进行去噪处理。下面是对代码的详细解释:

1、导入所需的库:numpy、matplotlib 和 math。
2、定义一个名为 getSin 的函数,用于生成正弦波。该函数接受振幅(amp)、频率(freq)、相位(phase)和采样点列表(sampleList)作为参数。
3、定义一个名为 getCos 的函数,用于生成余弦波。该函数的参数与 getSin 相同。
4、定义一个名为 denoise 的函数,用于去除振幅小于阈值的噪声。
5、设置采样率为 3000,并在 0 到 1 的范围内生成等间距的采样点。
6、生成四个正弦和余弦波。
7、将四个正弦和余弦波相加,得到混合信号。
8、使用 numpy 的 fft 函数计算傅里叶系数。
9、计算振幅列表。
10、将振幅数组和频率数组进行平移,使 0 Hz 位于中心。
11、创建两个子图,分别用于显示原始振幅频谱和处理后的振幅频谱。
12、绘制原始振幅频谱,并设置坐标轴范围和网格线。
13、对振幅频谱进行去噪处理。
14、绘制处理后的振幅频谱,并设置坐标轴范围和网格线。
15、显示图形。

 

# 导入所需的库
import numpy as np  # 用于进行数学计算
import matplotlib.pyplot as plt  # 用于绘制图形
import math  # 用于数学计算


# 定义一个函数,用于生成正弦波
def getSin(amp, freq, phase, sampleList):
    return amp * np.sin(-2 * math.pi * freq * sampleList + phase)


# 定义一个函数,用于生成余弦波
def getCos(amp, freq, phase, sampleList):
    return amp * np.cos(-2 * math.pi * freq * sampleList + phase)


# 定义去噪函数,将振幅小于阈值的噪声去除
def denoise(arr, thresh):
    mask = arr > thresh
    return mask * arr


# 设置采样率为 3000
srate = 3000
# 在 0 到 1 的范围内生成等间距的采样点
t = np.linspace(0, 1, srate)


# 生成四个正弦和余弦波
s1 = getSin(amp=1.5, freq=30, phase=0, sampleList=t)
s2 = getCos(amp=3, freq=5, phase=0, sampleList=t)
s3 = getSin(amp=10, freq=100, phase=0, sampleList=t)
s4 = getCos(amp=20, freq=120, phase=0, sampleList=t)



# 将四个正弦和余弦波相加,得到混合信号
mixed_signal = s1 + s2 + s3 + s4



# 使用 numpy 的 fft 函数计算傅里叶系数
fCoefs = np.fft.fft(mixed_signal, srate)


# 计算振幅列表
amp_list = 2 * np.abs(fCoefs / srate)


# 将振幅数组和频率数组进行平移,使 0 Hz 位于中心
freqs = np.fft.fftfreq(len(amp_list), 1/srate)
amp_shifted = np.fft.fftshift(amp_list)
freq_shift = np.fft.fftshift(freqs)



# 创建两个子图,分别用于显示原始振幅频谱和处理后的振幅频谱
fig, ax = plt.subplots(1, 2, figsize=(12, 4))


# 绘制原始振幅频谱
ax[0].stem(freq_shift, amp_shifted)
ax[0].set_xlim([-150, 150])
ax[0].set_ylim([-0.5, 21])
ax[0].grid()


# 对振幅频谱进行去噪处理
amp_shifted[(freq_shift > 110) | (freq_shift < -110)] = 0
amp_shifted = denoise(amp_shifted, 1)


# 绘制处理后的振幅频谱
ax[1].stem(freq_shift, amp_shifted)
# 设置第二个子图的坐标轴范围
ax[1].set_xlim([-150, 150])
ax[1].set_ylim([-0.5, 21])


# 给第二个子图添加网格线
ax[1].grid()


# 显示图形
plt.show()

在构想此代码时,目标是学习和展示信号处理的基本概念,特别是使用傅里叶变换对信号进行分析。下面是构想代码时的详细思考过程:

1、选择合适的库:为了实现信号处理和可视化,我们需要使用 numpy(数值计算)、matplotlib(绘图)和 math(数学函数)库。

2、生成基本信号:我们需要生成正弦波和余弦波。为此,定义了两个函数 getSin 和 getCos,它们接受振幅、频率、相位和采样点列表作为参数,返回对应的正弦波或余弦波。

3、混合信号:生成四个不同振幅、频率和相位的正弦和余弦波,将它们相加以获得一个复杂的混合信号。这个混合信号可以用来演示信号分析过程。

4、傅里叶变换:使用 numpy 的傅里叶变换函数(np.fft.fft)计算混合信号的傅里叶系数,这将把时域信号转换为频域信号。

5、计算振幅:根据傅里叶系数计算振幅列表。这些振幅值代表了信号在各个频率成分上的强度。

6、频谱整理:将振幅数组和频率数组平移,使 0 Hz 位于中心。这样,我们可以更容易地观察频谱的对称性。

7、可视化原始频谱:使用 matplotlib 创建两个子图。第一个子图用于显示原始振幅频谱。我们使用 stem 绘图函数绘制离散的振幅值,并设置坐标轴范围以及网格线。

8、去噪处理:我们希望对振幅频谱进行去噪处理,以便更清楚地看到原始信号中的主要成分。为此,我们定义了一个 denoise 函数,它根据给定的阈值去除振幅小于阈值的噪声。在这个例子中,我们选择阈值为 1,将频率大于 110 Hz 或小于 -110 Hz 的振幅设置为 0。

9、可视化处理后的频谱:在第二个子图中,我们显示经过去噪处理后的振幅频谱。同样使用 stem 绘图函数,并设置相应的坐标轴范围和网格线。

10、显示图形:使用 plt.show() 函数显示整个图形,从而对比原始频谱和处理后的频谱。

整个构想过程旨在设计一个简单的信号处理示例,帮助用户了解如何使用 Python 和相关库(如 numpy 和 matplotlib)处理信号。这个示例特别关注傅里叶变换及其在信号分析中的应用。

总结一下,这个示例的关键思路包括:

  1. 生成基本信号:创建正弦波和余弦波,通过调整振幅、频率和相位,产生不同的信号。
  2. 构建混合信号:将多个基本信号相加,模拟实际情况下可能遇到的复杂信号。
  3. 应用傅里叶变换:将复杂信号从时域转换到频域,便于分析信号中的频率成分。
  4. 计算振幅和频率:分析傅里叶变换的结果,提取信号在各个频率上的振幅信息。
  5. 对频谱进行去噪处理:通过设定阈值去除噪声,突显信号中的主要成分。
  6. 可视化频谱:使用 matplotlib 库绘制原始和处理后的振幅频谱,便于对比和分析。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值