Python3中已过滤wav文件的RMS值
我是Python新手,所以如果我需要澄清任何事情,请让我知道。我正在尝试获取已过滤wav文件的rms值。我能够使用usb麦克风在pyaudio流中录制wav文件,并将数据存储在块中,获取该块的rms值并将其存储在数组中,在它经过所有采样后,仅从该数组中获取最大rms值(所有操作都在函数mic0()下完成)。我以一种不同的格式重复这个过程,这种格式可以应用于滤波信号(因为我读取的是wav文件而不是流),并得到相同的结果 我想获取记录的wav文件,对其进行过滤,然后再次获取rms值。但在我使用butter_bandpass_filter函数之后,每当我试图计算rms值时,我总是得到18000左右。在将数据存储到函数中之前,我对其进行了规格化,使其与原始信号匹配(我在audacity中进行了检查),但这不会影响最终结果,因为我尝试删除该值(y/max_int16),它仍然会给我18000。此外,我还尝试处理数据类型,但我尝试的几乎所有操作都不起作用,或者导致过滤后的信号显示为0 代码如下:Python3中已过滤wav文件的RMS值,python,filtering,pyaudio,rms,butterworth,Python,Filtering,Pyaudio,Rms,Butterworth,我是Python新手,所以如果我需要澄清任何事情,请让我知道。我正在尝试获取已过滤wav文件的rms值。我能够使用usb麦克风在pyaudio流中录制wav文件,并将数据存储在块中,获取该块的rms值并将其存储在数组中,在它经过所有采样后,仅从该数组中获取最大rms值(所有操作都在函数mic0()下完成)。我以一种不同的格式重复这个过程,这种格式可以应用于滤波信号(因为我读取的是wav文件而不是流),并得到相同的结果 我想获取记录的wav文件,对其进行过滤,然后再次获取rms值。但在我使用but
import pyaudio
import wave
import audioop
import numpy as np
import datetime
import threading
import time
import os
from scipy.signal import butter, lfilter
from scipy.io.wavfile import write, read
os.chdir('/home/pi/Desktop/test') #mounting process
form_1 = pyaudio.paInt16 # 16-bit resolution
chans = 1 # 1 channel
samp_rate = 48000 # 48 kHz sampling rate
lowcut = 200
highcut = 20000
chunk = 1024 # samples for buffer
record_secs = 5 # seconds to record
dev_index0 = 2 # device index found by p.get_device_info_by_index(ii)
dev_index1 = 3
audio = pyaudio.PyAudio() # create pyaudio instantiation
print("Start")
# create pyaudio stream
stream0 = audio.open(format = form_1,rate = samp_rate,channels = chans, \
input_device_index = dev_index0,input = True, \
frames_per_buffer=chunk)
print("recording mic 1")
stream1 = audio.open(format = form_1,rate = samp_rate,channels = chans, \
input_device_index = dev_index1,input = True, \
frames_per_buffer=chunk)
print("recording mic 2")
def butter_bandpass(lowcut, highcut, samp_rate, order=5):
nyq = 0.5 * samp_rate
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band', analog=False)
return b, a
def butter_bandpass_filter(data, lowcut, highcut, samp_rate, order=5):
b, a = butter_bandpass(lowcut, highcut, samp_rate, order=order)
y = lfilter(b, a, data)
return y
def mic0():
global frames0, rms0, max0
rms0 = []
frames0 = []
# loop through stream and append audio chunks to frame array
for ii in range(0,int((samp_rate/chunk)*record_secs)):
data0 = stream0.read(chunk, exception_on_overflow=False)
frames0.append(data0)
rms0.append(audioop.rms(data0, 2))
max0 = np.max(rms0)
print(max0)
def mic1():
global frames1
frames1 = []
# loop through stream and append audio chunks to frame array
for ii in range(0,int((samp_rate/chunk)*record_secs)):
data1 = stream1.read(chunk, exception_on_overflow=False)
frames1.append(data1)
# start threading
t1 = threading.Thread(target=mic0)
t2 = threading.Thread(target=mic1)
t1.start()
t2.start()
t1.join()
t2.join()
dt = str(datetime.datetime.now())
wav_output_filename = 'mic1.wav' # name of .wav file
wavefile = wave.open(wav_output_filename,'wb')
wavefile.setnchannels(chans)
wavefile.setsampwidth(audio.get_sample_size(form_1))
wavefile.setframerate(samp_rate)
wavefile.writeframes(b''.join(frames0))
wavefile.close()
dt = str(datetime.datetime.now())
wav_output_filename = 'mic2.wav' # name of .wav file
wavefile = wave.open(wav_output_filename,'wb')
wavefile.setnchannels(chans)
wavefile.setsampwidth(audio.get_sample_size(form_1))
wavefile.setframerate(samp_rate)
wavefile.writeframes(b''.join(frames1))
wavefile.close()
# stop the stream, close it, and terminate the pyaudio instantiation
stream0.stop_stream()
stream0.close()
stream1.stop_stream()
stream1.close
audio.terminate()
print("end")
# check method, compare to max0
samplerate, data = read('mic1.wav')
rms = []
for i in range(0, 240000, 1024):
j = i + 1024
sub = data[i:j]
rms.append(audioop.rms(sub, 2))
max_rms = np.max(rms)
## max rms of unfiltered signal
print(max_rms)
##filtering
max_int16 = 2**15
y = butter_bandpass_filter(data, lowcut, highcut, samplerate, order=5)
write('mic1_filtered.wav', samplerate, y / max_int16)
samplerate, data_filtered = read('mic1_filtered.wav')
data_filtered = data_filtered * max_int16
rms_filtered = []
for i in range(0, 240000, 1024):
j = i + 1024
sub = data_filtered[i:j]
rms_filtered.append(audioop.rms(sub, 2))
max_filtered = np.max(rms_filtered)
## max rms of filtered signal
print(max_filtered)