予測可能な信号を発することを目的として超音波スピーカーを調整しようとしていますが、悲しいかな、おそらくDSP-fuが不足しているためです。
少し背景
私が持っている校正済みのレコーディングにできるだけ近いサウンドを再生できるようにしたいです。理論を理解している限り、スピーカーの伝達関数を見つけて、放出したい信号をデコンボリューションする必要があります。次のようなもの(周波数領域):
X -> H -> XH
どこにX
放射された信号はH
、スピーカーの伝達関数であり、XH
あるX
回H
。除算(./
)が与えられますH
。
ここで、キャリブレーションされた信号を送信するには、次のように分割する必要がありますH
。
X/H -> H -> X
何が行われたか
- 三脚に1 m間隔でスピーカーと校正済みマイクを配置しました。
- 記録された30+リニアスイープ150KHz-20KHz、長さ20ms、@ 500 KS / sで記録。
- 以下のMatlab / Octaveスクリプトを使用して信号を整列および平均化すると、スクリプトの下で結果の信号を確認できます。
files = dir('Mandag*');
rng = [1.5e6, 1.52e6];
[X, fs] = wavread(files(1).name, rng);
X = X(:,1);
for i=2:length(files)
[Y, fs] = wavread(files(i).name, rng);
sig = Y(:,1);
[x, off] = max(xcorr(X', sig'));
off = length(X) - off;
if(off < 0)
sig = [zeros(1, -off), sig(1:end+off)'];
elseif (off > 0)
sig = [sig(off:end)', zeros(1, off-1)];
end
X = X + sig';
end
X = X/length(files);
フーリエ変換
X
しXH
、上記の計算を行った結果、もっともらしいです。以下は、H
(紫)とX/H
(緑)の正規化されたプロットです。
プロットは関連する周波数に切り捨てられています。
これを間違った方法で行っている場合は、お知らせください。
私の質問
X/H
時間領域に変換し直す必要があると計算した後、これは単純なであるifft(X./H)
と想定しましたがwavwrite
、これまでの私の試みはすべて、もっともらしい答えを得ることができませんでした。周波数ベクトルHf
、H
とX
見ることができるここで MAT7バイナリ形式。
たぶん私は疲れていて、ここに簡単な解決策がありますが、現時点ではそれを見ることができません。どんな助け/アドバイスでも大歓迎です。