Kalibrasi speaker ultrasonik dan memancarkan sinyal yang dikalibrasi

10

Saya mencoba untuk mengkalibrasi speaker ultrasonik dengan tujuan memancarkan sinyal yang dapat diprediksi, tetapi sayangnya saya terus mengalami masalah, mungkin karena kurangnya DSP-fu.

Sedikit latar belakang

Saya ingin dapat memutar suara sedekat mungkin dengan rekaman yang saya kalibrasi. Sejauh yang saya mengerti teori, saya perlu menemukan fungsi transfer speaker dan mendekonvolusi sinyal yang ingin saya pancarkan dengannya. Sesuatu seperti ini (dalam domain frekuensi):

X -> H -> XH

Di mana Xadalah sinyal yang dipancarkan Hadalah fungsi transfer speaker dan XHmerupakan Xkali H. Divisi ( ./) sekarang harus memberi saya H.

Sekarang, untuk memancarkan sinyal terkalibrasi, itu harus dibagi dengan H:

X/H -> H -> X

Apa yang telah dilakukan

  • Speaker ditempatkan dan mikrofon yang dikalibrasi terpisah 1 m pada tripod.
  • Tercatat 30+ linear menyapu 150KHz-20KHz, panjang 20ms, dan direkam @ 500 KS / s.
  • Sinyal selaras dan rata-rata dengan skrip Matlab / Oktaf di bawah ini, di bawah skrip sinyal yang dihasilkan dapat dilihat.
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);

Sinyal rata dan rata

  • Fourier mengubah Xdan XHdan melakukan perhitungan yang disebutkan di atas, hasilnya terlihat masuk akal. Di bawah ini adalah plot dinormalisasi H(ungu) dan X/H(hijau).

    Plot frekuensi H dan X / H

Plot telah dipotong ke frekuensi yang relevan.

Tolong beri tahu saya jika saya salah tentang hal ini.

Pertanyaan saya

Setelah menghitung X/Hsaya perlu mengubahnya kembali ke domain waktu, saya berasumsi ini akan menjadi sederhana ifft(X./H)dan wavwrite, tetapi semua upaya saya sejauh ini gagal mendapatkan jawaban yang masuk akal. Sebuah vektor frekuensi Hf, Hdan Xdapat ditemukan di sini dalam format mat7-biner.

Mungkin saya lelah dan ada solusi sederhana di sini, tetapi saat ini saya tidak bisa melihatnya. Bantuan / saran sangat dihargai.

Thor
sumber
1
Utas ini - dsp.stackexchange.com/questions/953/… - dan yang ini- dsp.stackexchange.com/questions/2705/… - mungkin bermanfaat bagi Anda.
Jim Clay
Ya, menemukan kesalahan saya, terima kasih, Jim. Saya hanya mempertimbangkan besarnya sinyal, yang menghasilkan sinyal waktu tanpa fase. Sepertinya saya mendapat hasil yang benar sekarang dan saya akan menambahkannya sebagai jawaban.
Thor

Jawaban:

3

Menemukan jawabannya setelah melihat referensi yang disebutkan Jim Clay dalam komentar, terima kasih Jim.

Saya membuat kesalahan dengan hanya mempertimbangkan besarnya yang menghasilkan sinyal fase-nol dan tidak dapat digunakan secara masuk akal untuk emisi, setidaknya tidak dalam pengaturan ini.

Kode yang akhirnya saya gunakan dapat dilihat di bawah ini.

Script mematuhi konvensi penamaan menjaga sinyal domain waktu dalam sinyal domain huruf kecil dan frekuensi dalam huruf besar.

% 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

Spektrogram dari x conv hdan x deconv hdapat dilihat di bawah:

spektrogram x conv h spektrogram x dekonv h

Ini tampaknya masuk akal bagi saya meskipun ada beberapa suara dalam sinyal dekonvolusi.

Tes selanjutnya adalah untuk melihat apakah memancarkan x_deconv_ymemberikan sesuatu yang menyerupai xpembatasan frekuensi yang tidak dapat dipancarkan pembicara.

Perbarui dengan hasil tes

Kami redid pengukuran yang dijelaskan di atas menggunakan down-sweep logaritmik. Hasil ini tampaknya menunjukkan bahwa metode ini berfungsi.

Tes verifikasi terdiri dari memancarkan X / Hdan berharap untuk Xkembali, yaitu energi yang sama di semua frekuensi. Karena frekuensi output terburuk sekitar 20dB lebih lemah daripada yang terbaik, tingkat output tertinggi diperkirakan akan jauh lebih rendah.

Sinyal yang dipancarkan:

Rangkaian waktu dari sinyal yang dipancarkan

Rangkaian waktu dan spektrogram dari sinyal yang direkam terlihat seperti ini:

Rangkaian waktu dari sinyal yang dipancarkan Rangkaian waktu dari sinyal yang dipancarkan

Thor
sumber
Adakah pembaruan tentang ini? Bagaimana Anda memancarkan sinyal?
Lance
@Busk: Terima kasih atas minatnya. Saya belum memiliki kesempatan untuk mengujinya karena peralatan tersebut digunakan di tempat lain. Saya akan memposting hasilnya ketika saya sudah melakukan tes.
Thor
@Busk: Kami sekarang telah mengujinya dan sepertinya berhasil :-).
Thor