音声信号処理の基礎の基礎

DirectSound を使って音声信号をキャプチャし,フィルタリングするコードを書く機会があった.


処理内容は以下のようなもの.

  • ユーザが作成したフィルタを動的にロード
  • デバイスとフィルタを選択する.
  • 再生(停止可)


処理の流れはだいたいこんな感じに.


作りはオーソドックスに.今回,初めて Managed DirectX を使った.


以下作成したコード.何かの参考に.
SoundFilter
※FirFilterは16bitステレオ限定です.直さないと.


DirectSound は今まで使ったことなかったので,これ↓を参照しながら作った.

フィルタ係数の確認

↓とてもありがたいサイト
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