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 X
adalah sinyal yang dipancarkan H
adalah fungsi transfer speaker dan XH
merupakan X
kali 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);
Fourier mengubah
X
danXH
dan melakukan perhitungan yang disebutkan di atas, hasilnya terlihat masuk akal. Di bawah ini adalah plot dinormalisasiH
(ungu) danX/H
(hijau).
Plot telah dipotong ke frekuensi yang relevan.
Tolong beri tahu saya jika saya salah tentang hal ini.
Pertanyaan saya
Setelah menghitung X/H
saya 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
, H
dan X
dapat 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.
Jawaban:
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.
Spektrogram dari
x conv h
danx deconv h
dapat dilihat di bawah:Ini tampaknya masuk akal bagi saya meskipun ada beberapa suara dalam sinyal dekonvolusi.
Tes selanjutnya adalah untuk melihat apakah memancarkan
x_deconv_y
memberikan sesuatu yang menyerupaix
pembatasan 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 / H
dan berharap untukX
kembali, 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 dan spektrogram dari sinyal yang direkam terlihat seperti ini:
sumber