python - 为什么单个正弦信号的傅里叶变换有多个峰值?
问题描述
我一直在阅读有关傅立叶变换及其重要性的信息。为了通过自己的可视化来获得感觉,我尝试了一些事情。
- 绘制一个信号及其傅里叶变换
- 绘制具有不同频率(但幅度相同)的 2 个信号及其傅里叶变换
- 绘制了 3 个不同频率(但幅度相同)的信号及其傅里叶变换
这是我得到的。
一个信号及其傅里叶变换:
两个信号及其傅里叶变换:
三个信号及其傅里叶变换:
注意:橙色线代表傅里叶变换,蓝色线代表正在处理的信号。
我知道傅里叶变换有助于分解信号以给出构成主要信号的成分。换句话说,我们得到了组成主信号的不同频率的数量。但我不明白上述输出。如果我们考虑第一个信号,其中有单个信号并计算其傅里叶变换。为什么有4个峰?每个峰代表什么?我假设输出是单个信号的单个峰值,2 个信号的 2 个峰值和 3 个信号的 3 个峰值。
这是我用来生成上述图像的代码。
import numpy as np
import scipy.fftpack as fft
import matplotlib.pyplot as plt
sample_points = np.arange(0,100,1)
signal_1 = np.sin(sample_points) # 1x frequency
signal_2 = np.sin(20*sample_points) # 20x frequency
signal_3 = np.sin(100*sample_points) # 100x frequency
combined_signal = signal_1 + signal_2
fourier_transform = fft.fft(combined_signal)
plt.plot(sample_points, combined_signal)
plt.plot(sample_points, fourier_transform)
plt.xlabel("Sample points")
plt.gca().legend(('Combined Signal', 'Fourier Transform'))
#plt.show()
plt.savefig("combined_signal_ft.png")
plt.clf()
plt.plot(sample_points, signal_1)
plt.plot(sample_points, fft.fft(signal_1))
#plt.show()
plt.savefig("mono_ft.png")
plt.clf()
plt.plot(sample_points, signal_1 + signal_2 + signal_3)
plt.plot(sample_points, fft.fft(signal_1 + signal_2 + signal_3))
plt.savefig("tri_ft.png")
解决方案
scipy.fftpack.fft
返回正频率和负频率,您只需要代码中存储的正频率fourier_transform[1:len(signal)/2]
。在此处查看 scipy.fftpack.fft 文档
由于正弦和余弦函数的周期性,离散傅里叶变换的数学必须考虑负频率,更多信息请点击此处。
推荐阅读
- python - 如何从没有括号或引号的列表中打印整数,并且不使用 for 循环并且不转换为字符串?
- swift - Firestore 检查特定文档中的数组是否包含值
- javascript - jQuery - 切换点击两次
- reactjs - 尝试导入错误:“FiMail”未从“react/icons/fa”导出
- javascript - 使用 React Redux 创建新对象时,Flatlist 会继续添加列表
- python - python静态方法没有获取类对象的最新值
- python - 如何在 MySQL 5.6 中执行 IF (X OR Y)
- python - 对由另一列分组的 Pandas 数据框列值求和,然后用总和更新行并删除重复项
- microsoft-graph-api - 有什么方法可以使用图形 api 在 M365 中识别用户是 MailUser 还是普通 Cloud 用户?
- azure - 如何在 Azure 数据工厂中以 Salesforce 作为源创建增量负载?