用python实现gui界面文件浏览框选择指定wav文件并绘制1/3倍频程声压级结果。其中x轴为0-16000hz中心频率 y轴为-20到80db声压级
时间: 2024-02-23 10:59:38 浏览: 61
基于Python的通过获取音频来识别和弦或音高源代码,带GUI图形界面
好的,以下是使用Tkinter实现的代码,可以实现GUI界面文件浏览框选择指定wav文件并绘制1/3倍频程声压级结果。其中x轴为0-16000hz中心频率,y轴为-20到80db声压级:
```python
from pydub import AudioSegment
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import filedialog
# 1/3倍频程中心频率
frequencies = [50, 160, 500, 1600, 5000, 16000]
# 定义GUI界面
class App:
def __init__(self, master):
self.master = master
master.title("1/3倍频程声压级绘制")
# 添加文件浏览框
self.file_label = tk.Label(master, text="选择wav文件")
self.file_label.pack()
self.file_button = tk.Button(master, text="选择文件", command=self.select_file)
self.file_button.pack()
# 添加绘图区域
fig = plt.figure(figsize=(8, 5), dpi=100)
self.ax = fig.add_subplot(111)
self.ax.set_xlim(0, 16000)
self.ax.set_ylim(-20, 80)
self.ax.set_xlabel("Frequency (Hz)")
self.ax.set_ylabel("Sound pressure level (dB)")
self.ax.plot(frequencies, np.zeros(len(frequencies)))
self.canvas = FigureCanvasTkAgg(fig, master=master)
self.canvas.get_tk_widget().pack()
# 选择文件
def select_file(self):
file_path = filedialog.askopenfilename(defaultextension=".wav",
filetypes=[("WAV files", "*.wav")])
if file_path:
# 载入wav文件
sound = AudioSegment.from_wav(file_path)
samples = sound.get_array_of_samples()
# 计算1/3倍频程声压级结果
results = []
for frequency in frequencies:
# 计算频率范围
low = int(frequency / np.sqrt(2))
high = int(frequency * np.sqrt(2))
# 对样本进行FFT计算
fft = np.fft.fft(samples)
# 计算功率谱密度
psd = (1.0 / len(samples)) * np.square(np.abs(fft))
# 计算1/3倍频程内的功率
power = np.sum(psd[low:high])
# 计算声压级
db = 10 * np.log10(power)
results.append(db)
# 更新绘图
self.ax.clear()
self.ax.set_xlim(0, 16000)
self.ax.set_ylim(-20, 80)
self.ax.set_xlabel("Frequency (Hz)")
self.ax.set_ylabel("Sound pressure level (dB)")
self.ax.plot(frequencies, results)
self.canvas.draw()
# 创建GUI界面
root = tk.Tk()
app = App(root)
root.mainloop()
```
这段代码将创建一个GUI界面,包括一个文件浏览框和一个绘图区域。当用户选择一个wav文件后,将会计算1/3倍频程声压级结果,并在绘图区域中显示结果图。
希望这能对你有所帮助!
阅读全文