文件浏览框选择指定wav文件并绘制1/3倍频程结果,要求封装成函数或者类Python代码
时间: 2024-02-06 14:12:18 浏览: 35
以下是一个封装成类的Python代码示例,实现选择指定wav文件并绘制1/3倍频程结果:
```python
import wave
import numpy as np
import matplotlib.pyplot as plt
from tkinter import filedialog
from tkinter import *
class WavPlotter:
def __init__(self):
self.filename = None
self.sampling_rate = None
self.data = None
def load_file(self):
root = Tk()
root.withdraw()
self.filename = filedialog.askopenfilename(initialdir="./", title="Select a Wav File", filetypes=(("WAV files", "*.wav"),("all files", "*.*")))
with wave.open(self.filename, 'rb') as wav_file:
self.sampling_rate = wav_file.getframerate()
self.data = np.frombuffer(wav_file.readframes(-1), dtype=np.int16)
def plot_third_octave_spectrum(self):
if self.filename is None:
self.load_file()
freq, fft = self._get_fft()
third_octave_bands = self._get_third_octave_bands()
third_octave_fft = self._get_third_octave_fft(fft, freq, third_octave_bands)
plt.plot(third_octave_bands, third_octave_fft)
plt.xscale('log')
plt.xlim([20, self.sampling_rate / 2])
plt.ylim([0, max(third_octave_fft) * 1.1])
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.title('1/3 Octave Spectrum')
plt.show()
def _get_fft(self):
n = len(self.data)
fft = np.fft.fft(self.data)
freq = np.fft.fftfreq(n, d=1/self.sampling_rate)
return freq[:n//2], np.abs(fft[:n//2])
def _get_third_octave_bands(self):
center_frequencies = np.array([25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000])
lower_frequencies = center_frequencies / np.power(10, 1/6)
upper_frequencies = center_frequencies * np.power(10, 1/6)
return (lower_frequencies * upper_frequencies) ** 0.5
def _get_third_octave_fft(self, fft, freq, third_octave_bands):
third_octave_fft = []
for i in range(len(third_octave_bands) - 1):
lower_index = np.argmin(np.abs(freq - third_octave_bands[i]))
upper_index = np.argmin(np.abs(freq - third_octave_bands[i+1]))
third_octave_fft.append(np.mean(fft[lower_index:upper_index]))
return third_octave_fft
```
使用示例:
```python
wav_plotter = WavPlotter()
wav_plotter.load_file()
wav_plotter.plot_third_octave_spectrum()
```
其中 `load_file` 方法用于打开文件选择对话框并加载选择的wav文件,`plot_third_octave_spectrum` 方法用于绘制1/3倍频程结果,内部调用 `_get_fft`、`_get_third_octave_bands` 和 `_get_third_octave_fft` 方法实现频率域处理。