实现傅里叶变换并作图的python代码
时间: 2024-05-01 14:19:39 浏览: 99
以下是Python中实现傅里叶变换并作图的代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成需要处理的信号
t = np.linspace(0, 2 * np.pi, 1000)
y = 3 * np.sin(5 * t) + 2 * np.cos(10 * t) + np.random.rand(len(t))
# 计算信号的傅里叶变换
Y = np.fft.fft(y)
# 取前一半的幅值,排除直流分量和镜像部分
amplitude = 2 / len(t) * np.abs(Y[:len(t) // 2])
# 计算对应的频率
frequency = np.linspace(0, 1 / (2 * (t[1]-t[0])), len(t) // 2)
# 绘制图像
plt.figure()
plt.plot(frequency, amplitude)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.show()
```
这段代码可以生成一个包含傅里叶变换结果的频谱图像,可以帮助我们可视化信号包含的频率信息。
相关问题
python 傅里叶变换画图
### 使用 Python 实现傅里叶变换并绘图
为了实现傅里叶变换并绘制相应的图形,可以利用 `numpy` 和 `matplotlib` 库来完成这一过程。下面是一个完整的代码示例,展示了如何创建一个正弦波形,在时间域上对其进行采样,执行快速傅里叶变换 (FFT),最后展示其频谱。
#### 导入必要的库
首先需要导入用于数值计算和数据可视化的两个主要库:
```python
import numpy as np
import matplotlib.pyplot as plt
```
#### 设置参数与生成时域信号
定义一些基本参数如采样频率 (`Fs`)、目标频率 (`f`) 以及基于这些设置构建的时间向量 (`t`) 和对应的正弦波形式的时域信号 (`x`)。
```python
# 参数设定
Fs = 1000 # 采样频率
Ts = 1.0 / Fs # 采样间隔
f = 5 # 正弦波频率
time_end = 1 # 总持续时间为1秒
# 构建时间和信号数组
t = np.arange(0, time_end, Ts)
x = np.sin(2 * np.pi * f * t) # 创建正弦波信号[^1]
```
#### 执行 FFT 并处理结果
通过调用 `np.fft.fft()` 函数来进行离散傅立叶变换操作,并获取到转换后的复数表示的结果。接着计算出对应的真实物理意义下的频率轴以便于后续作图解释。
```python
n_samples = len(x) # 获取样本总数
y_fft = np.fft.fft(x) # 对输入信号做FFT得到复数输出
freq_axis = np.fft.fftfreq(n_samples, d=Ts) # 得到真实的频率范围
# 考虑到镜像特性只保留前半部分的数据
half_n = int(np.ceil((n_samples + 1)/2))
positive_freqs = freq_axis[:half_n]
magnitude_spectrum = 2*np.abs(y_fft)[:half_n]/n_samples # 归一化幅度谱[^3]
phase_spectrum = np.angle(y_fft)[:half_n] # 计算相位角
```
#### 绘制图像
最终使用 Matplotlib 来分别显示幅度谱和相位谱图表。
```python
plt.figure(figsize=(14,6))
# 绘制双边振幅谱(已归一化)
plt.subplot(1, 2, 1)
plt.plot(positive_freqs, magnitude_spectrum)
plt.title('单边振幅谱')
plt.xlabel('Frequency [Hz]')
plt.ylabel('|Y(f)|')
# 绘制双边相位谱
plt.subplot(1, 2, 2)
plt.plot(positive_freqs, phase_spectrum)
plt.title('单边相位谱')
plt.xlabel('Frequency [Hz]')
plt.ylabel(r'$\angle Y(f)$')
plt.tight_layout()
plt.show()
```
上述代码片段不仅实现了对给定模拟信号的傅里叶分析,还提供了直观的方式去理解该信号在不同频率成分上的分布情况及其相对强度和相位关系。
python傅里叶变换--幅度谱、相位谱、逆变换
### Python 中实现傅里叶变换
在Python中,通过`numpy`和`scipy`库能够方便地执行快速傅里叶变换(FFT),并计算幅度谱、相位谱以及完成逆变换。下面提供一段完整的示例代码来展示这一过程。
#### 导入必要的库
为了操作数据集与绘图,需引入几个重要的包:
```python
import numpy as np
from scipy.fft import fft, ifft
import matplotlib.pyplot as plt
```
#### 构建测试信号
创建一个简单的正弦波作为待分析的时间序列信号:
```python
t = np.linspace(0., 1., 1000) # 定义时间向量
freq_signal = 5 # 设定信号频率为5Hz
signal = np.sin(2.*np.pi*freq_signal*t) # 生产正弦波形
```
#### 执行快速傅里叶变换 (FFT)
利用`fft()`方法对上述构建好的信号实施转换,并获取相应的频率范围用于后续作图:
```python
transformed_data = fft(signal)
sample_rate = len(t)/(max(t)-min(t))
frequencies = np.fft.fftfreq(len(transformed_data), d=1./sample_rate)
```
#### 计算幅度谱与相位谱
对于每个复数值而言,其绝对值得到的就是该位置处的振幅大小;而角度则代表了相应成分的初相角:
```python
amplitude_spectrum = abs(transformed_data)/len(signal) # 归一化的幅度谱
phase_spectrum = np.angle(transformed_data) # 相位谱
```
#### 绘制图形表示结果
使用Matplotlib绘制出原始信号及其对应的双边频域特性图表:
```python
plt.figure(figsize=(14,8))
# 原始信号图像
plt.subplot(3,1,1)
plt.plot(t, signal, 'b')
plt.title('Original Signal', fontsize=12)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
# 双边幅度谱
plt.subplot(3,1,2)
plt.stem(frequencies[:int(len(frequencies)/2)], amplitude_spectrum[:int(len(amplitude_spectrum)/2)], use_line_collection=True)
plt.xlim(-10, 10)
plt.title('Double-sided Amplitude Spectrum of Original Signal', fontsize=12)
plt.xlabel('Frequency [$\mathrm{Hz}$]')
plt.ylabel('|X($\omega$)|')
# 单边相位谱
plt.subplot(3,1,3)
plt.stem(frequencies[:int(len(frequencies)/2)], phase_spectrum[:int(len(phase_spectrum)/2)], use_line_collection=True)
plt.xlim(-10, 10)
plt.title('Single-sided Phase Spectrum of Original Signal', fontsize=12)
plt.xlabel('Frequency [$\mathrm{Hz}$]')
plt.ylabel('$\\angle X(\omega)$')
plt.tight_layout()
plt.show()
```
#### 进行逆傅里叶变换恢复原信号
最后一步是对经过处理后的频域信息应用IFFT返回时域表达形式,验证两者之间的一致性:
```python
recovered_signal = ifft(transformed_data).real # 对于实数输入来说,只取实部即可获得重建的结果
plt.figure()
plt.plot(t, recovered_signal, label="Recovered", color='red')
plt.plot(t, signal, '--',label="Original",color='blue')
plt.legend(loc="best")
plt.grid(True)
plt.title("Comparison between original and reconstructed signals.")
plt.show()
```
此段程序展示了如何基于Python平台下的科学计算工具链——Numpy、Scipy及Matplotlib——来进行基本的傅立叶变换运算流程[^1][^2][^3][^4]。
阅读全文
相关推荐













