前提・実現したいこと
前回、バンドパスフィルタ処理がうまくいくようになったので、フィルタ処理を行う前、行った後とで、どのぐらい違いがあるのかを耳で聞きたいと思いました。
発生している問題・エラーメッセージ
音声が再生されるように、Ipython.display()を用いて実行したのですが、エラーメッセージが出ることがなく波形だけがプロットされました。
該当のソースコード
import sys import scipy.io.wavfile from scipy.fftpack import rfft,irfft,fftfreq import numpy as np import matplotlib.pyplot as plt import IPython.display as ipd #音声ファイル読み込み args = sys.argv wav_filename = args[1] rate, data = scipy.io.wavfile.read(wav_filename) #縦軸(振幅)の配列を作成 data = data / 32768 #横軸(時間)の配列を作成 #np.arange(初項, 等差数列の終点, 等差) time = np.arange(0, data.shape[0]/rate, 1/rate) #縦軸:dataを高速フーリエ変換する(時間領域から周波数領域に変換する) fft_data = np.fft.fft(data) #横軸:周波数の取得 #np.fft.fftfreq(データ点数, サンプリング周期) freqList = np.fft.fftfreq(data.shape[0], d=1.0/rate) # 正規化 + 交流成分2倍 fft_data = fft_data/24000 #サンプル数/2 #fft_data[0] = fft_data[0]/2 # 配列fft_dataをコピー fft_data2 = fft_data.copy() # bandpass処理 fft_data2[(freqList < 300)&(freqList > -300)] = 0 #highpass fft_data2[(freqList > 2300)|(freqList < -2300)] = 0 #lowpass # 高速逆フーリエ変換(時間信号に戻す) data2 = np.fft.ifft(fft_data2) # 振幅を元のスケールに戻す data2 = np.real(data2*48000) #N = 16000*3 # グラフ表示 fig = plt.figure(figsize=(10.0, 8.0)) plt.rcParams['font.family'] = 'Times New Roman' plt.rcParams['font.size'] = 12 #データプロット #時間信号(before) #plt.subplot(221) #plt.plot(time,data,label = 'f(n)') #plt.ylim(-1.5,1.5) #plt.xlabel("Time", fontsize=12) #plt.ylabel("Signal", fontsize=12) #plt.grid() #leg = plt.legend(loc=1, fontsize=15) #leg.get_frame().set_alpha(1) #周波数信号(before) #plt.subplot(222) #plt.plot(freqList, np.abs(fft_data),label = 'F(k)') #plt.xlim(-3000, 3000) #plt.ylim(0,0.1) #plt.xlabel('Frequency', fontsize=12) #plt.ylabel('Amplitude', fontsize=12) #plt.grid() #leg = plt.legend(loc=1, fontsize=15) #leg.get_frame().set_alpha(1) #時間信号(after) plt.subplot(221) plt.plot(time,data2,label = 'f2(n)') plt.ylim(-1.5,1.5) plt.xlabel("Time", fontsize=12) plt.ylabel("Signal", fontsize=12) plt.grid() leg = plt.legend(loc=1, fontsize=15) leg.get_frame().set_alpha(1) #周波数成分(after) plt.subplot(222) plt.plot(freqList,np.abs(fft_data2),label = 'F2(k)') plt.xlim(-3000,3000) plt.ylim(0,0.1) plt.xlabel('Frequency', fontsize=12) plt.ylabel('Amplitude', fontsize=12) plt.grid() leg = plt.legend(loc=1, fontsize=15) leg.get_frame().set_alpha(1) plt.show() ipd.Audio(data2,rate = 16000)
実行例:python ~.py ~.wav
試したこと
こちらのサイトを参考にして、音声を再生させるプログラムをかきましたが、先ほども記しましたが、画像だけがプロットされました。
→ipd.Audio(data2,rate = 16000) #rate:サンプリングレート
補足情報(FW/ツールのバージョンなど)
anaconda3を使用
グラフの下に再生ボタンとかシークバーが出てこないってことでいいんですよね?
こちらの方法でやってみるのは、いかがでしょうか
https://teratail.com/questions/307506
>>グラフの下に再生ボタンとかシークバーが出てこないってことでいいんですよね?
はい、そういうことです。
そちらを参考にさせていただきます。