카테고리 없음

Bandpass Filter for Audio

Wood Pecker 2021. 2. 5. 21:38

파이썬에서 mp3파일을 읽고 Bandpass 프로세싱을 하고 play하는 샘플 프로그램이다.  오디오  raw 데이터를 처리하고 play하는 프로그램은 여러 프로젝트에서 유용하다. 

from scipy.signal import butter, lfilter
import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
import simpleaudio as sa

def butter_bandpass(lowcut, highcut,fs, order=5):
    nyq= 0.5*fs
    low= lowcut/nyq
    high= highcut/nyq
    b,a = butter(order, [low,high], btype='band')
    return b,a

def butter_bandpass_filter(data, lowcut,highcut, fs, order=5):
    b,a= butter_bandpass( lowcut, highcut, fs, order)
    y=lfilter(b,a,data)
    return y

def playSineWaveSound():
    frequency = 400  # Our played note will be 440 Hz
    fs = 44100  # 44100 samples per second
    seconds = 3  # Note duration of 3 seconds
    t = np.linspace(0, seconds, seconds * fs, False)
    note = np.sin(frequency * t * 2 * np.pi)
    audio = note * (2 ** 15 - 1) / np.max(np.abs(note))
    audio = audio.astype(np.int16)
    play_obj = sa.play_buffer(audio, 1, 2, fs)
    play_obj.wait_done()
    plt.title('Sine signal')
    plt.plot(range(0,audio.shape[0]), audio, label='Sine signal')
    plt.show()

def callBandPassSample():
    audio_wave_data, sr = librosa.load("./datasets/sohn01.mp4.wav") # returns numpy.ndarray
    audio = audio_wave_data * (2 ** 15 - 1) / np.max(np.abs(audio_wave_data))
    y1= butter_bandpass_filter(audio, 100,520, sr, 3)
    #y2= butter_bandpass_filter(audio, 500,700, sr, 3)
    #y3= butter_bandpass_filter(audio, 1000,1700, sr, 3)
    xx= range(0,audio.shape[0] )

    plt.title('Original signal')
    plt.plot(xx, audio, label='')
    plt.show()

    plt.title('Bandpass signal')
    plt.plot(xx, y1, label='')
    plt.show()

    audio2 = y1.astype(np.int16)
    play_obj = sa.play_buffer(audio2, 1, 2, sr)
    play_obj.wait_done()
    pass

if __name__ == "__main__":
    callBandPassSample()
    pass

반응형