การสอบเทียบลำโพงอัลตราโซนิกและการส่งสัญญาณการสอบเทียบ


10

ฉันกำลังพยายามปรับเทียบลำโพงล้ำเสียงด้วยจุดประสงค์ของการส่งสัญญาณที่คาดเดาได้ แต่อนิจจาฉันยังคงมีปัญหาอาจเกิดจากการขาด DSP-fu ของฉัน

พื้นหลังเล็กน้อย

ฉันต้องการให้สามารถเล่นเสียงที่ใกล้เคียงที่สุดกับการบันทึกที่ปรับเทียบที่ฉันมี เท่าที่ฉันเข้าใจทฤษฎีฉันต้องค้นหาฟังก์ชั่นการถ่ายโอนลำโพงและถอดรหัสสัญญาณที่ฉันต้องการปล่อยออกมา บางสิ่งเช่นนี้ (ในโดเมนความถี่):

X -> H -> XH

ในกรณีที่Xมีการส่งสัญญาณปล่อยออกมาHเป็นฟังก์ชั่นการถ่ายโอนลำโพงและXHเป็นครั้งX Hส่วน ( ./) Hในขณะนี้ควรให้ฉัน

ตอนนี้เพื่อที่จะปล่อยสัญญาณที่สอบเทียบแล้วมันควรจะถูกหารด้วยH:

X/H -> H -> X

เกิดอะไรขึ้น

  • วางลำโพงและไมโครโฟนที่ปรับเทียบห่างกัน 1 เมตรบนขาตั้งกล้อง
  • บันทึกการกวาดแบบเส้นตรงกว่า 30+ 150KHz-20KHz, ยาว 20ms และบันทึกที่ 500 KS / s
  • สัญญาณที่มีการจัดตำแหน่งและเฉลี่ยโดยใช้สคริปต์ Matlab / Octave ด้านล่างภายใต้สคริปต์จะเห็นสัญญาณที่ได้
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);

จัดตำแหน่งและสัญญาณเฉลี่ย

  • ฟูริเยร์เปลี่ยนรูปXและXHทำการคำนวณตามที่ได้กล่าวไว้ข้างต้นผลลัพธ์ดูน่าเชื่อถือ ด้านล่างเป็นเนื้อเรื่องปกติของH(สีม่วง) และX/H(สีเขียว)

    พล็อตความถี่ของ H และ X / H

พล็อตได้ถูกตัดทอนเป็นความถี่ที่เกี่ยวข้อง

โปรดแจ้งให้เราทราบหากฉันทำผิดไป

คำถามของฉัน

หลังจากคำนวณX/Hแล้วฉันต้องแปลงกลับเป็นโดเมนเวลาฉันคิดว่านี่จะเป็นวิธีที่ง่ายifft(X./H)และwavwriteแต่ความพยายามทั้งหมดของฉันยังไม่ได้รับคำตอบที่น่าเชื่อถือ เวกเตอร์ความถี่Hf, HและXสามารถพบได้ที่นี่ในรูปแบบ mat7 ไบนารี

บางทีฉันแค่เหนื่อยและมีวิธีแก้ปัญหาง่าย ๆ ที่นี่ แต่ในขณะนี้ฉันไม่เห็น ความช่วยเหลือ / คำแนะนำใด ๆ ที่ชื่นชมมาก


1
กระทู้นี้ - dsp.stackexchange.com/questions/953/… - และหนึ่งในนี้- dsp.stackexchange.com/questions/2705/ ...... - อาจเป็นประโยชน์กับคุณ
Jim Clay

ใช่พบความผิดพลาดของฉันขอบคุณคุณจิม ฉันกำลังพิจารณาขนาดของสัญญาณเท่านั้นซึ่งส่งผลให้สัญญาณเวลาไม่เป็นศูนย์ ดูเหมือนว่าฉันจะได้ผลลัพธ์ที่ถูกต้องตอนนี้และฉันจะเพิ่มคำตอบนั้น
ธ.ค.

คำตอบ:


3

พบคำตอบหลังจากดูการอ้างอิงที่ Jim Clay พูดถึงในความคิดเห็นขอบคุณ Jim

ฉันทำผิดพลาดเพียงแค่พิจารณาขนาดซึ่งส่งผลให้สัญญาณเป็นศูนย์และจะไม่สามารถใช้อย่างชาญฉลาดสำหรับการปล่อยอย่างน้อยก็ไม่ได้อยู่ในการตั้งค่านี้

รหัสสุดท้ายที่ฉันใช้สามารถดูได้ด้านล่าง

สคริปต์ปฏิบัติตามระเบียบการตั้งชื่อเพื่อรักษาสัญญาณโดเมนเวลาในสัญญาณที่เป็นตัวพิมพ์เล็กและความถี่ในกรณีส่วนใหญ่

% 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

spectrograms จากx conv hและx deconv hสามารถดูด้านล่าง:

spectrogram ของ x Conv h สเปกโตรแกรมของ x deconv h

สิ่งเหล่านี้ดูเหมือนจะเป็นไปได้สำหรับฉันแม้ว่าจะมีสัญญาณรบกวนบางส่วนใน deconvolved

การทดสอบครั้งต่อไปจะเป็นการดูว่าการเปล่งเสียงx_deconv_yนั้นมีบางสิ่งที่คล้ายคลึงกับการxยกเว้นความถี่ที่ลำโพงไม่สามารถเปล่งออกมาได้หรือไม่

อัพเดตด้วยผลการทดสอบ

เราลดการวัดที่อธิบายข้างต้นโดยใช้การกวาดลอการิทึมลง ผลลัพธ์เหล่านี้ดูเหมือนจะแนะนำว่าวิธีการทำงาน

การทดสอบการตรวจสอบประกอบด้วยการเปล่งX / Hและคาดว่าจะได้รับXคืนเช่นพลังงานที่เท่าเทียมกันในทุกความถี่ เนื่องจากความถี่เอาท์พุทที่เลวร้ายที่สุดอยู่ที่ประมาณ 20dB ที่อ่อนแอกว่าที่ดีที่สุดระดับผลผลิตสูงสุดจึงคาดว่าจะต่ำกว่านั้นมาก

สัญญาณที่ถูกปล่อยออกมา:

อนุกรมเวลาของสัญญาณที่ปล่อยออกมา

อนุกรมเวลาและ spectrogram ของสัญญาณที่บันทึกไว้มีลักษณะดังนี้:

อนุกรมเวลาของสัญญาณที่ปล่อยออกมา อนุกรมเวลาของสัญญาณที่ปล่อยออกมา


มีการอัพเดทอะไรบ้าง? คุณส่งสัญญาณดูอย่างไร
แลนซ์

@ กลุ่ม: ขอบคุณสำหรับความสนใจ ฉันยังไม่ได้มีโอกาสทดสอบมันเนื่องจากมีการใช้อุปกรณ์อื่น ฉันจะโพสต์ผลลัพธ์เมื่อฉันทำแบบทดสอบเสร็จแล้ว
Thor

@Busk: ตอนนี้เราได้ทดสอบแล้วและดูเหมือนว่าจะทำงาน :-)
Thor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.