超音波スピーカーの校正と校正済み信号の発信


10

予測可能な信号を発することを目的として超音波スピーカーを調整しようとしていますが、悲しいかな、おそらくDSP-fuが不足しているためです。

少し背景

私が持っている校正済みのレコーディングにできるだけ近いサウンドを再生できるようにしたいです。理論を理解している限り、スピーカーの伝達関数を見つけて、放出したい信号をデコンボリューションする必要があります。次のようなもの(周波数領域):

X -> H -> XH

どこにX放射された信号はH、スピーカーの伝達関数であり、XHあるXH。除算(./)が与えられます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);

整列および平均化された信号

  • フーリエ変換XXH、上記の計算を行った結果、もっともらしいです。以下は、H(紫)とX/H(緑)の正規化されたプロットです。

    HおよびX / Hの周波数プロット

プロットは関連する周波数に切り捨てられています。

これを間違った方法で行っている場合は、お知らせください。

私の質問

X/H時間領域に変換し直す必要があると計算した後、これは単純なであるifft(X./H)と想定しましたがwavwrite、これまでの私の試みはすべて、もっともらしい答えを得ることができませんでした。周波数ベクトルHfHX見ることができるここで MAT7バイナリ形式。

たぶん私は疲れていて、ここに簡単な解決策がありますが、現時点ではそれを見ることができません。どんな助け/アドバイスでも大歓迎です。


1
このスレッド- dsp.stackexchange.com/questions/953/... -と、このワンdsp.stackexchange.com/questions/2705/...は -あなたに役に立つかもしれません。
ジム・クレイ

はい、私の間違いを見つけました、ありがとうございますジム。私は信号の大きさのみを考慮していたため、ゼロ位相の時間信号になります。これで正しい結果が得られたようです。これを答えとして追加します。
トール

回答:


3

ジム・クレイがコメントで述べた参照を見て、答えを見つけました、ジムに感謝します。

私は、ゼロ位相信号をもたらし、少なくともこのセットアップでは放射に適切に使用できない大きさのみを考慮するという間違いを犯しました。

最終的に使用したコードは以下のとおりです。

スクリプトは、時間領域信号を小文字に、周波数領域信号を大文字に保つという命名規則に従っています。

% Align and sum all files called Mandag*
files = dir('Mandag*');

% Where in the recordings the signal is
rng = [1.5e6, 1.52e6];

% Initialize the xh vector
[xh, fs] = wavread(files(1).name, rng);
xh = xh(:,1);

for i=2:length(files)
    y = wavread(files(i).name, rng);
    y = y(:,1);
    % Determine offset between xh and y
    [~, off] = max(xcorr(xh', y'));
    off = length(xh) - off;
    % Shift signal appropriately
    if(off < 0)
        y = [zeros(1, -off), y(1:end+off)'];
    elseif (off > 0)
        y = [y(off:end)', zeros(1, off-1)];
    end
    xh = xh + y';
end

% Average
xh = xh/length(files);

% Location of the 20ms signal
xh = xh(2306:12306-1);

% Normalize
xh = xh / max(xh);

% Apply a moving average filter on xh to reduce noise. Window size of 4 was
% experimentally determined to give the best results
n = 4;
B = zeros(n, 1);
for i=1:n
  B(i) = 1/n;
end
xh = filter(B, 1, xh);
xh = xh / max(xh);

x = wavread('sweep.wav');
x = x(1:2:end);            % Sweep generated @ 1MHz, decimate
                           % to have same length as xh

% Transform x into frequency domain and determine H
X = fft(x);
H = fft(xh) ./ X;

% Vector indices to choose only frequencies of interest
starti =  20e3 / 50;
endi   = 100e3 / 50;
rng    = starti:endi;
irng   = (length(x) - endi) : (length(x) - starti);

% Zero out unwanted frequencies
X = [zeros(1,      starti - 1   ), X( rng)', zeros(1, length(X)/2 - endi) ...
     zeros(1, length(X)/2 - endi), X(irng)', zeros(1,      starti - 1   )]';

% Deconvolve x with h
X_deconv_H = X ./ H;

% Transform X/H to time domain and normalise
x_deconv_h = real(ifft(X_deconv_H));
x_deconv_h = x_deconv_h / max(x_deconv_h);

% Save the deconvolved sweep
wavwrite(x_deconv_h, fs, 'deconvolved_sweep.wav');

% Generate  spectrograms of xh and x_deconv_h
winsize = 512;
overlap = round(.99 * winsize);
figure(1)
specgram(xh, winsize, fs, hann(winsize), overlap)
colorbar
figure(2)
specgram(x_deconv_h, winsize, fs, hann(winsize), overlap)
colorbar

スペクトログラムx conv hとは、x deconv h下に見ることができます。

x conv hのスペクトログラム x deconv hのスペクトログラム

デコンボリューションされた信号にはノイズがいくつかありますが、これらは私にはもっともらしいです。

次のテストは、スピーカーが発することができないそれらの周波数を除いて、発することがx_deconv_y類似のxものを与えるかどうかを見ることです。

テスト結果で更新

上記の測定を、対数のダウンスイープを使用してやり直しました。これらの結果は、この方法が機能することを示唆しているようです。

検証テストは、放出X / HしてX戻ることを期待すること、つまり、すべての周波数で等しいエネルギーで構成されていました。最悪の出力周波数は最高よりも約20dB弱いので、最高の出力レベルはそれよりはるかに低いと予想されます。

発信されたシグナル:

発信された信号の時系列

記録された信号の時系列とスペクトログラムは次のようになります。

発信された信号の時系列 発信された信号の時系列


これに関する更新はありますか?どのように信号の外観を出しましたか?
ランス

@Busk:関心をお寄せいただきありがとうございます。機器が他の場所で使用されているため、まだテストする機会がありませんでした。テストが完了したら、結果を投稿します。
トール

@Busk:テストしましたが、動作するようです:-)。
トール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.