🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2862閲覧

バンドパスフィルタ処理を行った周波数信号を時間信号に戻し、音声を再生させたい。

iface

総合スコア42

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/16 13:53

編集2020/12/16 13:54

前提・実現したいこと

前回、バンドパスフィルタ処理がうまくいくようになったので、フィルタ処理を行う前、行った後とで、どのぐらい違いがあるのかを耳で聞きたいと思いました。

発生している問題・エラーメッセージ

音声が再生されるように、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

試したこと

http://samuiui.com/2019/03/11/python%E3%81%A7%E9%9F%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/

こちらのサイトを参考にして、音声を再生させるプログラムをかきましたが、先ほども記しましたが、画像だけがプロットされました。

→ipd.Audio(data2,rate = 16000)  #rate:サンプリングレート

補足情報(FW/ツールのバージョンなど)

anaconda3を使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/12/17 04:48

グラフの下に再生ボタンとかシークバーが出てこないってことでいいんですよね?
iface

2020/12/18 15:38

>>グラフの下に再生ボタンとかシークバーが出てこないってことでいいんですよね? はい、そういうことです。
iface

2020/12/18 15:38

そちらを参考にさせていただきます。
guest

回答1

0

投稿2020/12/31 08:05

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問