fft_triangle_GUI.py
时间: 2023-07-22 18:34:58 浏览: 50
以下是一个Python的GUI程序,用于生成和绘制三角波,并对其进行FFT变换。你可以通过交互式的方式改变三角波的基本频率和幅度,并观察其对应的频域幅值谱的变化。
```python
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class FFTTriangleGUI:
def __init__(self):
self.fig, self.axs = plt.subplots(2, 1, figsize=(8, 6))
self.canvas = FigureCanvasTkAgg(self.fig, master=root)
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
self.freq_slider = tk.Scale(root, from_=1, to=20, resolution=0.1, orient=tk.HORIZONTAL, label='Frequency (Hz)', command=self.update_triangle)
self.freq_slider.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5)
self.amp_slider = tk.Scale(root, from_=0, to=1, resolution=0.01, orient=tk.HORIZONTAL, label='Amplitude', command=self.update_triangle)
self.amp_slider.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5)
self.freq = 5
self.amp = 0.5
self.update_triangle(None)
def update_triangle(self, event):
t = np.linspace(0, 1, 400, endpoint=False)
x = np.concatenate((t, np.flip(t)))
x -= np.mean(x)
x *= self.amp
x *= np.sin(2 * np.pi * self.freq * t)
self.axs[0].clear()
self.axs[0].plot(t, x[:len(t)])
self.axs[0].set_xlabel('Time (s)')
self.axs[0].set_ylabel('Amplitude')
self.axs[0].set_ylim((-1, 1))
X = np.fft.fft(x)
freqs = np.fft.fftfreq(len(x)) * 400
self.axs[1].clear()
self.axs[1].plot(freqs, np.abs(X))
self.axs[1].set_xlim((0, 20))
self.axs[1].set_xlabel('Frequency (Hz)')
self.axs[1].set_ylabel('Magnitude')
self.canvas.draw()
if __name__ == '__main__':
root = tk.Tk()
root.title('FFT Triangle Wave Demo')
FFTTriangleGUI()
root.mainloop()
```
运行程序后,将会弹出一个窗口,其中包含两个图,一个是三角波的时域波形,另一个是其对应的频域幅值谱。你可以通过拖动滑动条来改变三角波的基本频率和幅度。注意,频率轴的范围限制在0-20Hz之间,因此如果你将频率调整超过该范围,可能会看不到某些谐波分量的幅值。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)