import numpy as np import matplotlib.pyplot as plt import wave pltimg=True # Waveファイル読み込み関数 def read_wavedata(name): print('read: '+name) with wave.open(name,'r') as wavein: print(wavein.getparams()) rate = wavein.getframerate() nframes = wavein.getnframes() data = wavein.readframes(wavein.getnframes()) return np.frombuffer(data, dtype=np.int16),rate,nframes # Waveファイル書き込み関数 def write_wavedata(name,rate,data): print('write: '+name) with wave.open( name, 'wb') as waveout: rawdata=np.array(data,dtype='int16').tobytes() waveout.setparams((1, 2, rate, len(rawdata), 'NONE', 'NONE')) waveout.writeframes(rawdata) # スペクトログラム描画関数 def plot_spectrogram(data,file): cmap = plt.get_cmap('magma') plt.specgram(data/32768,Fs=fs,NFFT=512,scale='dB',mode='magnitude',vmax=0,vmin=-120,cmap=cmap) plt.colorbar() plt.xlabel('sec') plt.ylabel('Hz') if pltimg == True: plt.show() else: plt.savefig(file) x,fs,N = read_wavedata('DF_2_1.wav') y = np.zeros(N) # FIR フィルタ長 L = ? print('') print(f'サンプリング周波数 fs = {fs} Hz' ) print(f'信号長 N = {N} 点' ) print(f'再生時間 {N/fs} 秒' ) print(f'フィルタ長 L = {L}') # 移動平均フィルタのインパルス応答の計算 h = np.zeros(L) for i in range(L): h[i] = ? # FIR フィルタ # 出力信号は y[i] # i-n が負の場合は x[i-n] を足さない for i in range(N): y[i] = 0 for n in range(L): if i-n >= 0 : y[i] += ? # y[i] を wave ファイルとして保存 print('') write_wavedata('DF_2_1_out.wav',fs,y) print('') print('フィルタリング前') plot_spectrogram(x,'before.png') print('') print('フィルタリング後') plot_spectrogram(y,'after.png')