前提・実現したいこと
wavファイルを読み込み、scipy.signal.decimate()を用いてLPF込みの間引きを行いダウンサンプリング前後でグラフを比較してみました。
今回この関数を使った理由は、機械学習でフィルタ処理の効果について調べてまして、LPFのカットオフ周波数を考えたりせずフィルタ処理を行えると思ったからです。
発生している問題
時間信号での間引き前後の比較を行うと、見た目は全く変わらず、
周波数信号での間引き前後の比較を行うと、低周波数域が大幅に削減された状態になった。
terateilの都合上、プロット画像をお見せすることができませんが、低周波数域が大幅にカットされても、時間信号でグラフにあまり変化が見られないものでしょうか。
該当のソースコード
python
1import numpy as np 2import matplotlib.pyplot as plt 3import sys 4import scipy.io.wavfile 5from scipy.io.wavfile import write 6from scipy.io.wavfile import read 7from scipy.fftpack import rfft,irfft,fftfreq 8from scipy import signal 9 10##音声ファイル読み込み## 11args = sys.argv 12wav_filename = args[1] 13rate, data = scipy.io.wavfile.read(wav_filename) 14time = np.arange(0,data.shape[0]/rate,1/rate) #時間軸作成 15 16print(len(time)) 17print(len(data)) 18print("data_MAX:",np.max(data)) 19print("data_min:",np.min(data)) 20 21 22#dataを高速フーリエ変換 23fft_data = np.fft.fft(data) 24freqList = np.fft.fftfreq(data.shape[0], 1.0/rate) #周波数取得 25 26fft_data = fft_data/22050 #サンプル数/2 27 28 29###################### scipy.signal.decimate ############################# 30data_d = signal.decimate(data, 10) # 間引き 31rate_d = rate/10 #間引き後のサンプリング周波数 32time_d = np.arange(0,data_d.shape[0]/rate_d,1/rate_d) #間引き後の時間軸 33 34print("data_d:",len(data_d)) 35print("time_d:",len(time_d)) 36print("data_d_MAX:",np.max(data_d)) 37print("data_d_min:",np.min(data_d)) 38 39#dataを高速フーリエ変換 40fft_data_d = np.fft.fft(data_d) 41freqList_d = np.fft.fftfreq(data_d.shape[0], 1.0/rate_d) #周波数取得 42 43fft_data_d = fft_data_d/22050 #サンプル数/2 44 45###################################################################################### 46 47 48 49######################## グラフ表示 ########################################## 50fig = plt.figure(figsize=(10.0, 4.0)) 51plt.rcParams['font.family'] = 'Times New Roman' 52plt.rcParams['font.size'] = 12 53 54#データプロット 55#時間信号(before) 56plt.subplot(211) 57plt.plot(time,data,color='g') # 単純間引きの時間波形 58plt.plot(time_d,data_d,'darkorange') # decimate()による間引きの時間波形 59plt.xlim(0,5) 60plt.xlabel("Time", fontsize=12) 61plt.ylabel("Signal", fontsize=12) 62plt.grid() 63plt.legend(['before decimation','filtered decimation'], loc=1) 64 65#周波数信号(before) 66plt.subplot(212) 67plt.plot(freqList, np.abs(fft_data),color='g') 68plt.plot(freqList_d, np.abs(fft_data_d),color='darkorange') 69plt.xlim(0, 5000) 70plt.xlabel('Frequency', fontsize=12) 71plt.ylabel('Amplitude', fontsize=12) 72plt.grid() 73leg = plt.legend(loc=1, fontsize=15) 74plt.legend(['before decimation','filtered decimation'], loc=1) 75 76plt.show() 77plt.close()
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー