python实现gui界面文件浏览框选择指定wav文件并绘制1/3倍频程声压级结果。x轴分别为0,50,160,500,1600,5000,16000的中心频率 y轴为-20到80db声压级
时间: 2024-02-23 12:59:55 浏览: 193
好的,我可以为您提供一个基本的GUI界面和实现绘制指定WAV文件声压级的代码。以下代码使用Python tkinter库实现GUI界面,使用Python wavfile和numpy库读取和处理WAV文件,使用Python matplotlib库绘制声压级结果。
请注意,以下代码仅供参考,您需要根据自己的需求进行修改和优化。代码中的注释可以帮助您理解代码的作用。
```python
import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt
from scipy.io import wavfile
import numpy as np
# 创建一个GUI界面
root = tk.Tk()
root.title("WAV文件声压级绘制")
# 创建一个Canvas用于绘制图形
canvas = tk.Canvas(root, width=600, height=400)
canvas.pack()
# 创建一个Label用于显示选择的WAV文件路径
filename_label = tk.Label(root, text="请选择一个WAV文件")
filename_label.pack()
# 创建一个Button用于选择WAV文件
def select_file():
filepath = filedialog.askopenfilename()
filename_label.config(text="已选择文件:" + filepath)
draw_wav(filepath)
select_button = tk.Button(root, text="选择文件", command=select_file)
select_button.pack()
# 绘制指定WAV文件的声压级结果
def draw_wav(filepath):
# 读取WAV文件
rate, data = wavfile.read(filepath)
# 计算1/3倍频程的中心频率
freqs = [0, 50, 160, 500, 1600, 5000, 16000]
center_freqs = [(freqs[i]+freqs[i+1])/2 for i in range(len(freqs)-1)]
# 计算每个中心频率对应的FFT点的索引
n = len(data)
k = np.arange(n)
T = n / rate
freq = k / T
idxs = [np.argmin(np.abs(freq-center_freq)) for center_freq in center_freqs]
# 计算每个中心频率的声压级
levels = [20*np.log10(np.abs(np.fft.fft(data)[idx])) for idx in idxs]
# 绘制声压级结果
fig, ax = plt.subplots()
ax.plot(center_freqs, levels)
ax.set_xscale('log')
ax.set_xlabel('Frequency (Hz)')
ax.set_ylabel('Sound Pressure Level (dB SPL)')
ax.set_xlim(center_freqs[0], center_freqs[-1])
ax.set_ylim(-20, 80)
ax.grid(True)
ax.set_title('Sound Pressure Level of ' + filepath)
plt.show()
# 运行GUI界面
root.mainloop()
```
您可以将以上代码保存为.py文件并运行,然后选择一个WAV文件,即可在GUI界面上看到该WAV文件的声压级结果。
阅读全文