質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

1回答

1439閲覧

Pythonでのハイパスフィルタが実装できない

hirohiro1999

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/09/22 05:43

編集2021/09/22 08:02

pythonを使って音声解析をしています。
現在1秒ごとに波形の表示とその波形のフーリエ変換を行っています。
以下のコードが該当するのですが、300ヘルツ以下をカットした状態でプロットしたいです。
ハイパスフィルタというのですがPython初心者でありどのようにコードを変更すればよいのかわかりません。
わかる方がいらっしゃいましたら変えるコードを教えていただきたいです。
何卒宜しくお願い致します。

以下のサイトのコードを参考に実行しようとしたのですが、このコードを実行すると300ヘルツ以下をカットしたいのに300以上がカットされてしまいます。
https://algorithm.joho.info/programming/python/numpy-fast-fourier-transform/#toc3

python

1# -*- coding: utf-8 -*- 2import wave 3 4from matplotlib.colors import same_color 5import numpy as np 6import matplotlib.pyplot as plt 7 8def main(): 9 filename = "04-agarikata-kara-01-p6TAskMJUgg.wav" 10 wf = wave.open(filename, "r" ) 11 12 # WAVファイルの情報を表示 13 print ("オーディオチャンネル数(モノラル: 1 ステレオ:2 ) : ", wf.getnchannels()) 14 print ("サンプルサイズ(バイト数) : ", wf.getsampwidth()) 15 print ("サンプリングレート : ", wf.getframerate()) 16 print ("オーディオフレーム数 : ", wf.getnframes()) 17 print ("圧縮形式 : ", wf.getcomptype()) 18 print ("(圧縮形式) : ", wf.getcompname()) 19 print ("パラメータ : ", wf.getparams()) 20 print ("記録時間(Sec) : ", float(wf.getnframes()) / wf.getframerate() ) 21 22 fs = wf.getframerate() # サンプリング周波数 23 24 fc = 300 # カットオフ周波数 25 26 g = wf.readframes(wf.getnframes()) 27 g = np.frombuffer(g, dtype= "int16")/32768.0 # -1~1に正規化 28 29 mado = 1#s 30 N = mado*fs # サンプル数=窓(1秒)×サンプリング周波数 31 32 freq = np.linspace(0, 1.0/mado, N) 33 34 wf.close() 35 for ki in range(round(wf.getnframes()/fs)-1): 36 n0 = ki # サンプリング開始位置 37 gz = g[::2] # サンプル数片方にわける 38 gg = gz[ki*N:ki*N+N] 39 # print(fs,ki,N,gz,gg) 40 G = np.fft.fft(gg) # 高速フーリエ変換 41 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル 42 phase = [np.arctan2(int(c.imag), int(c.real)) for c in G] # 位相スペクトル 43 flist = np.fft.fftfreq(N, d=1.0/fs) # 周波数リスト 44 flist[(freq < fc)] = 0 45 flist[(freq > 1/(mado*2))] = 0 46 47 # 波形サンプルを描画 48 fig = plt.figure() 49 plt.subplot(211) 50 plt.plot(np.linspace(n0,n0+mado,N),gg) 51 plt.axis([n0, n0+mado, -0.2, 0.2]) 52 plt.xlabel("時間 [sample]",fontname="MS Gothic") 53 plt.ylabel("振幅",fontname="MS Gothic") 54 55 # 振幅スペクトルを描画 56 plt.subplot(212) 57 plt.plot(flist, amp, marker='o', linestyle='-') 58 plt.axis([0, fs/2, 0, int(max(amp))]) 59 plt.xlabel("周波数 [Hz]",fontname="MS Gothic") 60 plt.ylabel("振幅スペクトル",fontname="MS Gothic") 61 output ="C:\Users\hiro2\Desktop\sound\kara" 62 fig.savefig(output+"\"+str(ki)+"_"+str(mado)+".jpg") 63 plt.close() 64 fig = plt.figure() 65 plt.close() 66 67if __name__ == '__main__': 68 main()

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

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

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

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

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

y_waiwai

2021/09/22 05:44

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
hirohiro1999

2021/09/22 05:47

ありがとうございます。 直します!
1T2R3M4

2021/09/22 05:51

質問テンプレートにあったと思いますが、 調べたこと、試したことを追記していただけませんか。
jbpb0

2021/09/22 06:44

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
hirohiro1999

2021/09/22 06:51

すみません。 投稿が不慣れで。。。 このような形でよろしでしょうか?
jbpb0

2021/09/22 07:15

大丈夫です
jbpb0

2021/09/25 11:17

flist[(freq < fc)] = 0 flist[(freq > 1/(mado*2))] = 0 ↓ 変更 amp[((flist < fc) & (flist > -fc))] = 0 で、どうでしょうか?
jbpb0

2021/10/21 06:00

どうでしたか?
hirohiro1999

2021/10/21 06:02

うまくいきました! ありがとうございました!!!
guest

回答1

0

ベストアンサー

python

1flist[(freq < fc)] = 0 2flist[(freq > 1/(mado*2))] = 0

↓ 変更

python

1amp[((flist < fc) & (flist > -fc))] = 0

投稿2021/10/21 06:04

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問