Ultrasonik hoparlör kalibrasyonu ve kalibre edilmiş sinyaller yayma


10

Öngörülebilir sinyaller yaymak için bir ultrasonik hoparlörü kalibre etmeye çalışıyorum, ancak ne yazık ki muhtemelen DSP-fu eksikliğimden dolayı sorun yaşıyorum.

Biraz arka plan

Sahip olduğum kalibre bir kayda olabildiğince yakın sesler çalabilmek istiyorum. Teoriyi anladığım kadarıyla, hoparlör aktarım işlevini bulmam ve onunla yaymak istediğim sinyalleri çözmem gerekiyor. Bunun gibi bir şey (frekans alanında):

X -> H -> XH

Nerede Xyayılan sinyal Hhoparlörler transfer fonksiyonu ve XHbir Xkere H. ./Şimdi bana bir bölünme ( ) vermeli H.

Şimdi, kalibre edilmiş bir sinyal yaymak için, bölünmesi gerekir H:

X/H -> H -> X

Ne yapıldı

  • Tripodlara 1 m aralıklarla yerleştirilmiş hoparlör ve kalibre edilmiş mikrofon.
  • Kaydedilmiş 30+ doğrusal tarama, 20ms uzunluğunda 150KHz-20KHz ve 500 KS / s'de kaydedilmiştir.
  • Aşağıdaki Matlab / Octave betiği ile hizalanmış ve ortalaması alınmış sinyaller, betiğin altında ortaya çıkan sinyal görülebilir.
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);

Hizalanmış ve ortalamalı sinyaller

  • Fourier dönüştü Xve XHyukarıda belirtilen hesaplamaları yaptı, sonuç mantıklı görünüyor. Aşağıda H(mor) ve X/H(yeşil) normalleştirilmiş bir çizim vardır .

    H ve X / H frekans grafiği

Grafik ilgili frekanslara kesildi.

Lütfen bunu yanlış bir şekilde yapmamı söyleyin.

Benim sorum

Hesaplandıktan sonra X/Hben zaman alanına geri dönüşümü için gereken, bu basit olacağını kabul ifft(X./H)ve wavwriteama bütün girişimleri defa herhangi makul bir cevap almak için başarısız oldu. Bir frekans vektörü Hf, Hve Xbulunabilir burada mat7-ikili formatta.

Belki sadece yorgunum ve burada basit bir çözüm var, ama şu anda göremiyorum. Herhangi bir yardım / tavsiye çok takdir edilmektedir.



Evet, hatamı buldum teşekkür ederim Jim. Sadece sinyallerin büyüklüğünü düşünmüştüm, bu da sıfır aşamalı bir sinyalle sonuçlanır. Görünüşe göre şimdi doğru sonucu aldım ve bunu bir cevap olarak ekleyeceğim.
Thor

Yanıtlar:


3

Jim Clay'in yorumlarda bahsettiği referanslara baktıktan sonra cevabı buldum, teşekkür ederim Jim.

Sadece sıfır fazlı sinyalle sonuçlanan ve en azından bu kurulumda değil, emisyon için mantıklı olarak kullanılamayan büyüklüğü dikkate alarak hata yaptım.

Sonunda kullandığım kod aşağıda görülebilir.

Komut dosyası, zaman etki alanı sinyallerini küçük harf ve frekans etki alanı sinyallerini büyük harf olarak tutma adlandırma kuralına uyar.

% 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

Spektrogramları x conv hve x deconv haşağıda görülebilir:

x dönş h spektrogramı x dekonv h spektrogramı

Geri dönüşümü olmayan sinyalde biraz gürültü olmasına rağmen, bunlar benim için makul görünüyor.

Bir sonraki test, x_deconv_yyaymanın xhoparlörün yayılamadığı frekansları kısıtlayan bir şey verip vermediğini görmek olacaktır .

Test sonuçlarıyla güncelleme

Yukarıda açıklanan ölçümleri bir logaritmik aşağı doğru süpürme kullanarak yeniden inceledik. Bu sonuçlar yöntemin işe yaradığını düşündürmektedir.

Doğrulama testi, yayma X / Hve Xgeri dönmeyi beklemekten ibaretti , yani tüm frekanslarda eşit enerji. En kötü çıkış frekansı en iyiden yaklaşık 20dB daha zayıf olduğundan, en yüksek çıkış seviyesinin çok daha düşük olması beklenir.

Yayılan sinyal:

Yayılan sinyalin zaman serisi

Kaydedilen sinyalin zaman serileri ve spektrogramı şöyle görünür:

Yayılan sinyalin zaman serisi Yayılan sinyalin zaman serisi


herhangi bir güncelleme var mı_ Sinyal nasıl yayıldınız?
Lance

@Busk: İlginiz için teşekkürler. Ekipman başka bir yerde kullanıldığından henüz test etme şansım olmadı. Testi yaptığımda sonuçları yayınlayacağım.
Thor

@Busk: Şimdi test ettik ve işe yarıyor :-).
Thor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.