gui界面文件浏览框选择指定wav文件并绘制1/3倍频程声压级结果。其中x轴为0-16000hz中心频率 y轴为-20到80db声压级用python实现
时间: 2024-02-23 19:59:14 浏览: 161
MATLAB.rar_MATLAB 等效声级_三分之一_声压_声压倍频程_总声压
5星 · 资源好评率100%
好的,以下是完整的Python代码,可以实现GUI界面文件浏览框选择指定wav文件并绘制1/3倍频程声压级结果,其中x轴为0-16000hz中心频率,y轴为-20到80db声压级:
```python
import tkinter as tk
from tkinter import filedialog
import os
import matplotlib.pyplot as plt
import numpy as np
import wave
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
# 创建文件浏览按钮
self.file_button = tk.Button(self)
self.file_button["text"] = "选择文件"
self.file_button["command"] = self.select_file
self.file_button.pack(side="top")
def select_file(self):
# 打开文件浏览窗口
file_path = filedialog.askopenfilename()
print(file_path)
# 绘制声压级结果
self.plot_spl(file_path)
def plot_spl(self, file_path):
# 打开wav文件
with wave.open(file_path, "rb") as f:
# 获取声道数、采样宽度和采样率
channels = f.getnchannels()
sample_width = f.getsampwidth()
sample_rate = f.getframerate()
# 读取所有采样数据
frames = f.readframes(-1)
# 将二进制数据转换为numpy数组
samples = np.frombuffer(frames, dtype=np.int16)
# 计算FFT
n = len(samples)
freqs = np.fft.fftfreq(n, d=1/sample_rate)
fft = np.fft.fft(samples)
fft_abs = np.abs(fft)
fft_db = 20 * np.log10(fft_abs / sample_rate / sample_width * 2)
# 计算1/3倍频程声压级
spl = []
for i in range(16):
mask = (freqs >= i*1000/3) & (freqs < (i+1)*1000/3)
spl.append(np.max(fft_db[mask]))
# 绘制图形
plt.bar(range(16), spl)
plt.xticks(range(16), ["{:.0f}".format(i*1000/3) for i in range(16)])
plt.xlim(-0.5, 15.5)
plt.ylim(-20, 80)
plt.xlabel("Center Frequency (Hz)")
plt.ylabel("SPL (dB)")
plt.show()
root = tk.Tk()
app = Application(master=root)
app.mainloop()
```
在上面的代码中,我们首先创建了一个名为`Application`的类来实现GUI界面,其中包括一个文件浏览按钮。当用户点击文件浏览按钮时,会弹出文件浏览窗口,用户可以选择需要处理的wav文件。选择文件后,我们会调用`plot_spl`函数来绘制1/3倍频程声压级结果。
在`plot_spl`函数中,我们首先使用Python的wave库来读取wav文件,然后使用numpy库和matplotlib库来计算FFT并绘制声压级结果。计算1/3倍频程声压级时,我们将频率范围分成16个区间,每个区间的中心频率为1000/3 Hz,然后分别计算每个区间内的最大声压级。最后,我们使用matplotlib库来绘制柱状图,并设置x轴、y轴范围和标签。
将上面的代码保存为Python文件并运行,可以得到一个GUI界面,用户可以选择需要处理的wav文件,程序会自动绘制该文件的1/3倍频程声压级结果。
阅读全文