Ich versuche, einen Ultraschalllautsprecher mit dem Ziel zu kalibrieren, vorhersagbare Signale zu senden, aber leider habe ich immer wieder Probleme, wahrscheinlich aufgrund meines Mangels an DSP-Fu.
Ein kleiner Hintergrund
Ich möchte in der Lage sein, Sounds so nah wie möglich an einer kalibrierten Aufnahme wiederzugeben, die ich habe. Soweit ich die Theorie verstehe, muss ich die Lautsprecherübertragungsfunktion finden und die Signale, die ich damit aussenden möchte, entfalten. So etwas (im Frequenzbereich):
X -> H -> XH
Wo X
ist das ausgesendete Signal H
ist die Lautsprecherübertragungsfunktion und XH
ist X
Zeiten H
. Eine Division ( ./
) sollte mir jetzt geben H
.
Um nun ein kalibriertes Signal zu senden, sollte es geteilt werden durch H
:
X/H -> H -> X
Was wurde getan?
- Platzierter Lautsprecher und ein kalibriertes Mikrofon in einem Abstand von 1 m auf Stativen.
- Aufgezeichnete 30+ lineare Sweeps von 150 kHz bis 20 kHz, 20 ms lang und aufgezeichnet bei 500 KS / s.
- Ausgerichtete und gemittelte Signale mit dem Matlab / Octave-Skript unten, unter dem Skript kann das resultierende Signal angezeigt werden.
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 transformiert
X
undXH
und die oben genannten Berechnungen durchgeführt, sieht das Ergebnis plausibel aus. Unten ist eine normalisierte Darstellung vonH
(lila) undX/H
(grün).
Der Plot wurde auf die relevanten Frequenzen gekürzt.
Bitte lassen Sie mich wissen, wenn ich das falsch mache.
Meine Frage
Nach der Berechnung X/H
muss ich es zurück in den Zeitbereich transformieren, nahm ich dies ein einfacher wäre , ifft(X./H)
und wavwrite
, aber alle meine Versuche haben bisher eine plausible Antwort bekommen gescheitert. Ein Frequenzvektor Hf
, H
und X
kann gefunden werden hier in MAT7-Binärformat.
Vielleicht bin ich nur müde und es gibt hier eine einfache Lösung, aber im Moment kann ich es nicht sehen. Jede Hilfe / Beratung wird sehr geschätzt.
Antworten:
Ich habe die Antwort gefunden, nachdem ich mir die Referenzen angesehen habe, die Jim Clay in den Kommentaren erwähnt hat. Vielen Dank, Jim.
Ich habe den Fehler gemacht, nur die Größe zu berücksichtigen, die zu einem nullphasigen Signal führt und nicht sinnvoll für die Emission verwendet werden kann, zumindest nicht in diesem Setup.
Der Code, den ich letztendlich verwendet habe, ist unten zu sehen.
Das Skript hält sich an die Namenskonvention, Zeitdomänensignale in Kleinbuchstaben und Frequenzdomänensignale in Großbuchstaben zu halten.
Die Spektrogramme von
x conv h
undx deconv h
sind unten zu sehen:Diese erscheinen mir plausibel, obwohl das entfaltete Signal etwas Rauschen enthält.
Der nächste Test wird sein, um zu sehen, ob das Aussenden
x_deconv_y
etwas Ähnliches ergibt,x
abgesehen von den Frequenzen, die der Lautsprecher nicht aussenden kann.Update mit Testergebnissen
Wir haben die oben beschriebenen Messungen mit einem logarithmischen Down-Sweep überarbeitet. Diese Ergebnisse scheinen darauf hinzudeuten, dass die Methode funktioniert.
Der Verifikationstest bestand aus dem Aussenden
X / H
und der Erwartung,X
zurück zu kommen , dh gleiche Energie in allen Frequenzen. Da die schlechteste Ausgangsfrequenz etwa 20 dB schwächer als die beste ist, wird erwartet, dass der höchste Ausgangspegel so viel niedriger ist.Das Signal, das ausgesendet wurde:
Die Zeitreihen und das Spektrogramm des aufgezeichneten Signals sehen folgendermaßen aus:
quelle