Próbuję skalibrować głośnik ultradźwiękowy w celu emitowania przewidywalnych sygnałów, ale niestety ciągle mam problemy, prawdopodobnie z powodu braku DSP-fu.
Trochę tła
Chcę móc odtwarzać dźwięki jak najbliżej skalibrowanego nagrania, które mam. O ile rozumiem teorię, muszę znaleźć funkcję przenoszenia głośników i dekonwolować sygnały, które chcę z nią emitować. Coś takiego (w dziedzinie częstotliwości):
X -> H -> XH
Gdzie X
jest emitowany sygnał H
jest funkcja przenoszenia głośników i XH
to X
czasy H
. Podział ( ./
) powinien mi teraz dać H
.
Teraz, aby wyemitować skalibrowany sygnał, należy go podzielić przez H
:
X/H -> H -> X
Co zostało zrobione
- Umieszczony głośnik i skalibrowany mikrofon w odległości 1 m od statywów.
- Nagrano ponad 30 liniowych przebiegów 150 kHz-20 kHz o długości 20 ms i zarejestrowano przy 500 KS / s.
- Wyrównane i uśrednione sygnały za pomocą skryptu Matlab / Octave poniżej, pod skryptem można zobaczyć wynikowy sygnał.
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);
Fourier przekształcił się
X
iXH
wykonał wspomniane powyżej obliczenia, wynik wydaje się wiarygodny. Poniżej znajduje się znormalizowany wykresH
(fioletowy) iX/H
(zielony).
Fabuła została obcięta do odpowiednich częstotliwości.
Daj mi znać, jeśli podejdę do tego w niewłaściwy sposób.
Moje pytanie
Po obliczeniu X/H
muszę go przekształcić z powrotem w dziedzinę czasu, przyjąłem, że będzie to proste ifft(X./H)
i wavwrite
, ale wszystkie moje dotychczasowe próby nie dały żadnej wiarygodnej odpowiedzi. A wektor częstotliwości Hf
, H
i X
można znaleźć tutaj w formacie mat7-binarny.
Może jestem po prostu zmęczony i istnieje tutaj proste rozwiązanie, ale w tej chwili go nie widzę. Każda pomoc / rada jest bardzo mile widziana.
Odpowiedzi:
Znalazłem odpowiedź po zapoznaniu się z referencjami, o których wspominał Jim Clay w komentarzach, dziękuję Jim.
Popełniłem błąd, biorąc pod uwagę tylko wielkość, która skutkuje zerowym sygnałem fazowym i nie może być sensownie wykorzystana do emisji, przynajmniej nie w tym ustawieniu.
Kod, którego ostatecznie użyłem, można zobaczyć poniżej.
Skrypt jest zgodny z konwencją nazewnictwa polegającą na przechowywaniu sygnałów w dziedzinie czasu małymi literami i sygnałów w dziedzinie częstotliwości dużymi literami.
Spektrogramy
x conv h
ix deconv h
można zobaczyć poniżej:Wydaje mi się to prawdopodobne, chociaż w rozłożonym sygnale występuje pewien szum.
Następnym testem będzie sprawdzenie, czy emitowanie
x_deconv_y
daje coś podobnego zx
wyjątkiem częstotliwości, których głośnik nie może emitować.Zaktualizuj z wynikami testu
Ponownie zmierzyliśmy opisane powyżej pomiary, używając logarytmicznego przemiatania w dół. Te wyniki wydają się sugerować, że metoda działa.
Test weryfikacyjny polegał na emisji
X / H
i oczekiwaniu naX
powrót, tj. Równej energii na wszystkich częstotliwościach. Ponieważ najgorsza częstotliwość wyjściowa jest o około 20 dB słabsza niż najlepsza, najwyższy poziom wyjściowy powinien być znacznie niższy.Sygnał, który został wysłany:
Szeregi czasowe i spektrogram zarejestrowanego sygnału wyglądają następująco:
źródło