Python代码文件浏览框选择指定wav文件并绘制1/3倍频程结果并且封装成函数或者类。
时间: 2024-02-16 11:00:05 浏览: 75
好的,您可以使用Python的tkinter库来创建GUI界面,并使用matplotlib库来进行绘图。下面是一个简单的实现代码,其中包括一个函数和一个类,可以实现您的需求:
```python
import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt
import numpy as np
import wave
def plot_third_octave(file_path):
# 打开WAV文件
with wave.open(file_path, 'r') as wav_file:
# 获取采样率和采样位数
sample_rate = wav_file.getframerate()
sample_width = wav_file.getsampwidth()
# 读取所有声道的数据
data = wav_file.readframes(wav_file.getnframes())
# 将二进制数据转化为数组
data = np.frombuffer(data, dtype='<i{}'.format(sample_width))
# 计算FFT变换结果
spectrum = np.fft.rfft(data)
# 计算频率范围
freq = np.fft.rfftfreq(len(data), 1 / sample_rate)
# 计算1/3倍频程范围
freq_range = np.logspace(np.log10(20), np.log10(sample_rate // 2), 30 * 3)
third_octave_spectrum = np.zeros(len(freq_range) - 1)
for i, f in enumerate(freq_range[:-1]):
idx = np.logical_and(freq >= f / np.sqrt(2), freq < freq_range[i + 1] / np.sqrt(2))
third_octave_spectrum[i] = np.sqrt(np.sum(np.abs(spectrum[idx]) ** 2))
# 绘图
plt.plot(freq_range[:-1], third_octave_spectrum)
plt.xscale('log')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Spectrum Amplitude')
plt.title('1/3 Octave Spectrum')
plt.show()
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.file_path = tk.StringVar()
self.create_widgets()
def create_widgets(self):
self.file_label = tk.Label(self.master, text='Please select a WAV file:')
self.file_label.pack(side='top')
self.file_entry = tk.Entry(self.master, textvariable=self.file_path)
self.file_entry.pack(side='top')
self.file_button = tk.Button(self.master, text='Browse', command=self.browse_file)
self.file_button.pack(side='top')
self.plot_button = tk.Button(self.master, text='Plot', command=self.plot_spectrum)
self.plot_button.pack(side='top')
def browse_file(self):
file_path = filedialog.askopenfilename(filetypes=[('Wave files', '*.wav')])
self.file_path.set(file_path)
def plot_spectrum(self):
file_path = self.file_path.get()
if file_path:
plot_third_octave(file_path)
if __name__ == '__main__':
root = tk.Tk()
app = Application(master=root)
app.mainloop()
```
这个代码中:
- `plot_third_octave`函数可以读取指定WAV文件,计算1/3倍频程的频谱,并绘制出来。
- `Application`类使用tkinter库创建了一个GUI界面,包括一个输入框和两个按钮,其中第一个按钮可以打开文件对话框来选择WAV文件,第二个按钮可以绘制1/3倍频程的频谱。
- 如果您需要封装成一个类或者函数来调用,可以使用上面的代码作为参考,将其封装成您需要的形式。
阅读全文