Hiệu chuẩn loa siêu âm và phát ra tín hiệu hiệu chuẩn


10

Tôi đang cố gắng hiệu chỉnh loa siêu âm với mục đích phát ra các tín hiệu có thể dự đoán được, nhưng than ôi tôi vẫn gặp rắc rối, có lẽ là do tôi không có DSP-fu.

Một chút nền tảng

Tôi muốn có thể phát lại âm thanh gần nhất có thể với bản ghi đã hiệu chỉnh mà tôi có. Theo như tôi hiểu lý thuyết, tôi cần tìm chức năng chuyển loa và giải mã các tín hiệu tôi muốn phát ra với nó. Một cái gì đó như thế này (trong miền tần số):

X -> H -> XH

XTín hiệu phát ra ở đâu là Hchức năng truyền loa và XHXthời gian H. Một bộ phận ( ./) bây giờ sẽ cho tôi H.

Bây giờ, để phát ra tín hiệu hiệu chỉnh, nên chia cho H:

X/H -> H -> X

Những gì đã được thực hiện

  • Loa được đặt và micrô được hiệu chỉnh cách nhau 1 m trên giá ba chân.
  • Ghi lại hơn 30 lần quét tuyến tính 150KHz-20KHz, dài 20ms và được ghi @ 500 KS / s.
  • Các tín hiệu được căn chỉnh và trung bình với tập lệnh Matlab / Octave bên dưới, dưới tập lệnh có thể nhìn thấy tín hiệu kết quả.
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);

Các tín hiệu được căn chỉnh và trung bình

  • Fourier biến đổi XXHthực hiện các tính toán được đề cập ở trên, kết quả có vẻ hợp lý. Dưới đây là một âm mưu chuẩn hóa của H(màu tím) và X/H(màu xanh lá cây).

    Biểu đồ tần số của H và X / H

Cốt truyện đã được cắt ngắn đến các tần số có liên quan.

Xin vui lòng cho tôi biết nếu tôi đi sai về điều này.

Câu hỏi của tôi

Sau khi tính toán X/Htôi cần chuyển đổi nó trở lại miền thời gian, tôi cho rằng việc này sẽ đơn giản ifft(X./H)wavwrite, nhưng tất cả các nỗ lực của tôi cho đến nay đều không nhận được bất kỳ câu trả lời hợp lý nào. Một vector tần số Hf, HXcó thể được tìm thấy ở đây trong định dạng mat7-nhị phân.

Có lẽ tôi chỉ mệt mỏi và có một giải pháp đơn giản ở đây, nhưng hiện tại tôi không thể thấy nó. Bất kỳ trợ giúp / lời khuyên được nhiều đánh giá cao.


1
Chủ đề này - dsp.stackexchange.com/questions/953/, - và cái này - dsp.stackexchange.com/questions/2705/ Lỗi - có thể hữu ích cho bạn.
Jim Clay

Vâng, tìm thấy lỗi của tôi cảm ơn bạn Jim. Tôi chỉ xem xét cường độ của các tín hiệu, dẫn đến tín hiệu thời gian không có pha. Có vẻ như bây giờ tôi đã có kết quả đúng và tôi sẽ thêm vào đó như một câu trả lời.
Thor

Câu trả lời:


3

Tìm thấy câu trả lời sau khi xem các tài liệu tham khảo mà Jim Clay đã đề cập trong các bình luận, cảm ơn Jim.

Tôi đã phạm sai lầm khi chỉ xem xét cường độ dẫn đến tín hiệu không có pha và không thể sử dụng một cách hợp lý để phát xạ, ít nhất là không trong thiết lập này.

Mã cuối cùng tôi đã sử dụng có thể được nhìn thấy dưới đây.

Kịch bản tuân thủ quy ước đặt tên là giữ các tín hiệu miền thời gian ở các tín hiệu miền thường và tần số ở dạng chữ thường.

% 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

Các phổ của x conv hx deconv hcó thể được nhìn thấy dưới đây:

quang phổ của x CON h quang phổ của x deconv h

Chúng có vẻ hợp lý với tôi mặc dù có một số nhiễu trong tín hiệu được giải mã.

Thử nghiệm tiếp theo sẽ là xem liệu phát ra có x_deconv_ymang lại thứ gì đó giống như xchặn các tần số mà loa không thể phát ra hay không.

Cập nhật với kết quả kiểm tra

Chúng tôi làm lại các phép đo được mô tả ở trên bằng cách sử dụng quét xuống logarit. Những kết quả này dường như cho thấy phương pháp hoạt động.

Kiểm tra xác minh bao gồm phát ra X / Hvà mong đợi để lấy Xlại, tức là năng lượng bằng nhau trong tất cả các tần số. Vì tần số đầu ra tồi tệ nhất là khoảng 20dB yếu hơn mức tốt nhất, mức đầu ra cao nhất dự kiến ​​sẽ thấp hơn nhiều.

Tín hiệu được phát ra:

Chuỗi thời gian của tín hiệu phát ra

Chuỗi thời gian và phổ của tín hiệu được ghi trông như thế này:

Chuỗi thời gian của tín hiệu phát ra Chuỗi thời gian của tín hiệu phát ra


Bất kỳ cập nhật về điều này? Làm thế nào bạn phát ra tín hiệu nhìn?
Lance

@Busk: Cảm ơn sự quan tâm. Tôi chưa có cơ hội thử nghiệm vì thiết bị đang được sử dụng ở nơi khác. Tôi sẽ đăng kết quả khi tôi thực hiện bài kiểm tra.
Thor

@Busk: chúng tôi hiện đã thử nghiệm và nó dường như hoạt động :-).
Thor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.