用于音频处理的基本低通滤波器- Python



我正在用麦克风接收音频,并希望过滤掉高频信号。我已经遵循了所有的步骤来设计一个简单的低通滤波器,但我得到下面的错误

如果x.shape[axis] <= edge:元组索引超出范围

我的代码如下;

import pyaudio
import sys
import time
import matplotlib.pyplot as plt
import numpy as np
import scipy.signal

import struct
from gpiozero import LED, Button
import matplotlib.animation as animation
from matplotlib import style
style.use('fivethirtyeight')


CHUNK = 1024
FRAMES_PER_BUFFER = 3200
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
    p = pyaudio.PyAudio()
    
    stream = p.open(
            format = FORMAT,
            channels = CHANNELS,
            rate = RATE,
            input = True,
            output = False,
            #input_device_index = 1,
            frames_per_buffer = FRAMES_PER_BUFFER
            )
    
    
    
    print('stream is starting')
    
    
    player = p.open(format = FORMAT,
             channels = CHANNELS,
             rate = RATE,
             input = True,
             output = True,
             frames_per_buffer = FRAMES_PER_BUFFER
    
            )
    while True:
        if button.is_pressed:
            print('MIC1 is running')
            if not started:
                stream.start_stream()
                started = True
    
        frames = []
        data = stream.read(CHUNK, exception_on_overflow = False)
        frames.append(data)    
        ##################### Lowpass Filter ###########################################
        a, b = scipy.signal.butter(2, 0.1, 'lowpass', analog = False)
        fdata = scipy.signal.filtfilt(b,a , data, axis=0)
        player.write(fdata)
       
                  
    
    else:
        if started:
            stream.stop_stream()
            started = False
        
        print('LED is ON')
        led.on()
        time.sleep(2)
        led.off()
        time.sleep(2)

如果我删除低通滤波器,程序工作正常。

帮忙吗?

无论可能存在任何其他问题,您都将一个字节字符串传递给过滤器,并且该字节字符串具有"空"形状,所以即使试图访问axis=0也会导致你看到的错误。
您可能想转换为numpy数组,然后再转换回来,通过将适当的行更改为-

fdata = scipy.signal.filtfilt(b, a, np.frombuffer(data), axis=0).tobytes()

注意np.frombuffer.tobytes()的用法
您可能还想更改过滤器系数的顺序,要么在同一行,要么在…

最新更新