Python3中已过滤wav文件的RMS值

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

我是Python新手,所以如果我需要澄清任何事情,请让我知道。我正在尝试获取已过滤wav文件的rms值。我能够使用usb麦克风在pyaudio流中录制wav文件,并将数据存储在块中,获取该块的rms值并将其存储在数组中,在它经过所有采样后,仅从该数组中获取最大rms值(所有操作都在函数mic0()下完成)。我以一种不同的格式重复这个过程,这种格式可以应用于滤波信号(因为我读取的是wav文件而不是流),并得到相同的结果

我想获取记录的wav文件,对其进行过滤,然后再次获取rms值。但在我使用butter_bandpass_filter函数之后,每当我试图计算rms值时,我总是得到18000左右。在将数据存储到函数中之前,我对其进行了规格化,使其与原始信号匹配(我在audacity中进行了检查),但这不会影响最终结果,因为我尝试删除该值(y/max_int16),它仍然会给我18000。此外,我还尝试处理数据类型,但我尝试的几乎所有操作都不起作用,或者导致过滤后的信号显示为0

代码如下:

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)