DirectSound を使って音声信号をキャプチャし,フィルタリングするコードを書く機会があった.
処理内容は以下のようなもの.
- ユーザが作成したフィルタを動的にロード
- デバイスとフィルタを選択する.
- 再生(停止可)
作りはオーソドックスに.今回,初めて Managed DirectX を使った.
以下作成したコード.何かの参考に.
SoundFilter
※FirFilterは16bitステレオ限定です.直さないと.
DirectSound は今まで使ったことなかったので,これ↓を参照しながら作った.
DirectX9実践プログラミング Windows Vista対応版posted with amazlet on 08.02.17
フィルタ係数の確認
↓とてもありがたいサイト
http://momiji.i.ishikawa-nct.ac.jp/dfdesign/fir/mado.shtml
↑ここでできちゃうけど,後学のために自分でもやってみる.
# -*- coding: utf-8 -*- import math PI = math.pi fs = 44100 # サンプリング fc = 4000 # カットオフ M = 10 # 遅延数 N = M*2+1 # 係数の総数 wc = PI*(1 - 2.0*fc/fs) # サンプリング定理により負にならない h = [0 for i in range(N)] # n=0 だけ特殊 h[N/2] = (1 - 2.0*fc/fs) # n = 0: h[n] = wc/PI for i in [t for t in range(-M, M+1) if not t==0]: h[N/2+i] = (1.0/(PI*i))*math.sin(i*wc) # ハイパス化 for i in range(-M, M+1): h[N/2+i] = ((-1)**i)*h[N/2+i] # ハミング窓 hamming = lambda i: 0.54 + 0.46*math.cos(i*PI/M) for i in range(-M, M+1): h[N/2+i] = hamming(i)*h[N/2+i] print h