अल्ट्रासोनिक स्पीकर कैलिब्रेशन और उत्सर्जित कैलिब्रेटेड सिग्नल


10

मैं भविष्य कहे जाने वाले संकेतों का उत्सर्जन करने के उद्देश्य से एक अल्ट्रासोनिक स्पीकर को जांचने की कोशिश कर रहा हूं, लेकिन अफसोस कि मैं डीएसपी-फू की कमी के कारण परेशानी में हूं।

थोड़ी पृष्ठभूमि

मुझे लगता है कि मेरे पास एक कैलिब्रेटेड रिकॉर्डिंग के लिए जितना संभव हो उतना करीब प्लेबैक करने में सक्षम होना चाहिए। जहां तक ​​मैं सिद्धांत को समझता हूं, मुझे बोलने वालों के ट्रांसफर फ़ंक्शन को खोजने और उन संकेतों को हटाने की आवश्यकता है जो मैं इसके साथ उत्सर्जन करना चाहता हूं। ऐसा कुछ (फ़्रीक्वेंसी डोमेन में):

X -> H -> XH

कहाँ Xउत्सर्जित संकेत है Hवक्ताओं हस्तांतरण समारोह है और XHहै Xबार H। एक विभाजन ( ./) अब मुझे देना चाहिए H

अब, एक कैलिब्रेटेड सिग्नल का उत्सर्जन करने के लिए, इसे Hनिम्न से विभाजित किया जाना चाहिए :

X/H -> H -> X

क्या हो गया है?

  • तिपाई पर स्पीकर और एक कैलिब्रेटेड माइक्रोफोन को 1 मीटर अलग रखा।
  • रिकॉर्ड 30+ लीनियर स्वीप्स 150KHz-20KHz, 20ms लंबा और @ 500 KS / s दर्ज किया गया।
  • नीचे दिए गए मैटलैब / ऑक्टेव स्क्रिप्ट के साथ संरेखित और औसतन संकेत, स्क्रिप्ट के तहत परिणामी संकेत देखा जा सकता है।
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(हरा) का एक सामान्यीकृत प्लॉट है ।

    एच और एक्स / एच की आवृत्ति साजिश

प्लॉट को संबंधित फ्रिक्वेंसी में काट दिया गया है।

कृपया मुझे बताएं कि क्या मैं इसके बारे में गलत तरीके से जा रहा हूं।

मेरा प्रश्न

गणना करने के बाद X/Hमुझे इसे वापस समय डोमेन में बदलने की आवश्यकता है, मैंने माना कि यह एक सरल ifft(X./H)और होगा wavwrite, लेकिन मेरे अब तक के सभी प्रयास किसी भी उत्तर देने में विफल रहे हैं। एक आवृत्ति वेक्टर Hf, Hऔर यहां मैट 7-बाइनरी प्रारूप में Xपाया जा सकता है ।

शायद मैं थका हुआ हूँ और यहाँ एक सरल समाधान है, लेकिन फिलहाल मैं इसे नहीं देख सकता। किसी भी मदद / सलाह बहुत सराहना की है।


1
यह धागा - dsp.stackexchange.com/questions/953/… - और यह एक- dsp.stackexchange.com/questions/2705/… - आपके लिए उपयोगी हो सकता है।
जिम क्ले

हाँ, मेरी गलती मिली, धन्यवाद जिम। मैं केवल संकेतों की भयावहता पर विचार कर रहा था, जिसके परिणामस्वरूप शून्य चरणबद्ध समय संकेत मिलता है। लगता है कि मुझे अब सही परिणाम मिल गया है और मैं इसे एक उत्तर के रूप में जोड़ दूंगा।
थोर

जवाबों:


3

जिम क्ले ने टिप्पणियों में जिन संदर्भों का उल्लेख किया है, उन्हें देखने के बाद जवाब मिला, धन्यवाद जिम।

मैंने केवल उस परिमाण पर विचार करने की गलती की जिसके परिणामस्वरूप शून्य-चरण संकेत मिलता है और उत्सर्जन के लिए समझदारी से उपयोग नहीं किया जा सकता है, कम से कम इस सेटअप में नहीं।

अंत में मैंने जिस कोड का उपयोग किया था, वह नीचे देखा जा सकता है।

स्क्रिप्ट लो-केस में टाइम डोमेन सिग्नल और अपर-केस में फ्रीक्वेंसी डोमेन सिग्नल रखने के नामकरण सम्मेलन का पालन करती है।

% 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

के स्पेक्ट्रोग्राम x conv hऔर x deconv hनीचे देखे जा सकते हैं:

एक्स कनवेंस एच का स्पेक्ट्रोग्राम एक्स डेकोनव एच का स्पेक्ट्रोग्राम

ये मेरे लिए प्रशंसनीय लगते हैं, हालांकि डिकॉन्वॉल्व्ड सिग्नल में कुछ शोर है।

अगला परीक्षण यह देखने के लिए होगा कि क्या उत्सर्जन उन आवृत्तियों को छोड़कर x_deconv_yकुछ ऐसा दिखता xहै जो स्पीकर उत्सर्जित नहीं कर सकता है।

परीक्षण के परिणामों के साथ अद्यतन करें

हम एक लॉगरिदमिक डाउन-स्वीप का उपयोग करके ऊपर वर्णित मापों को फिर से करते हैं। इन परिणामों से लगता है कि विधि काम करती है।

सत्यापन परीक्षण में सभी आवृत्तियों में उत्सर्जन X / Hऔर Xसमान ऊर्जा प्राप्त करने की अपेक्षा शामिल थी । जैसा कि सबसे खराब आउटपुट आवृत्ति सबसे अच्छे से लगभग 20dB कमजोर है, उच्चतम उत्पादन स्तर के बहुत कम होने की उम्मीद है।

उत्सर्जित संकेत:

उत्सर्जित संकेत की समय श्रृंखला

रिकॉर्ड सिग्नल की टाइम सीरीज़ और स्पेक्ट्रोग्राम इस तरह दिखते हैं:

उत्सर्जित संकेत की समय श्रृंखला उत्सर्जित संकेत की समय श्रृंखला


इस पर किसी भी अद्यतन? आपने सिग्नल को कैसे उत्सर्जित किया?
लांस

@ बस्क: रुचि के लिए धन्यवाद। मुझे अभी तक इसका परीक्षण करने का मौका नहीं मिला क्योंकि उपकरण कहीं और इस्तेमाल किया जा रहा है। जब मैंने परीक्षण कर लिया है तो मैं परिणाम पोस्ट करूँगा।
थॉर

@ बस्क: हमने अब इसका परीक्षण किया है और यह काम करने के लिए लगता है :-)।
थोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.