Python3中过滤后的wav文件的RMS值

如何解决Python3中过滤后的wav文件的RMS值

我是 Python 新手,所以如果我需要澄清任何事情,请告诉我。我正在尝试获取过滤后的 wav 文件的 rms 值。我能够在 pyaudio 流中使用 USB 麦克风录制 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,\
                    input_device_index = dev_index1,\
                    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,order=5):
    b,a = butter_bandpass(lowcut,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,samplerate,order=5)
write('mic1_filtered.wav',y / max_int16)
      
samplerate,data_filtered = read('mic1_filtered.wav')
data_filtered = data_filtered * max_int16
rms_filtered = []
for i in range(0,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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-