मैं ध्वनि betwwen 2 कंप्यूटर के माध्यम से डेटा संचारित करने पर एक उदाहरण लिख रहा हूं। कुछ आवश्यकताएँ:
दूरी बहुत करीब है, यानी 2 कंप्यूटर मूल रूप से एक दूसरे से सटे हुए हैं
बहुत कम शोर (मुझे नहीं लगता कि मेरे शिक्षक एक रॉक गीत को शोर स्रोत के रूप में चालू करेंगे)
त्रुटि स्वीकार्य है: उदाहरण के लिए यदि मैं "रेडियो संचार" भेजता हूं, तो यदि दूसरा कंप्यूटर "रेडियोक्यू कम्युनिकेशन" प्राप्त करता है, तो यह ठीक भी है।
यदि संभव हो तो: कोई हेडर, झंडा, चेकसम, .... क्योंकि मैं सिर्फ ध्वनि के माध्यम से डेटा प्रसारित करने की मूल बातें प्रदर्शित करने वाला एक बहुत ही मूल उदाहरण चाहता हूं। फैंसी होने की जरूरत नहीं है।
मैंने इस लिंक के अनुसार ऑडियो फ़्रीक्वेंसी शिफ़्ट कीइंग का उपयोग करने की कोशिश की:
लैब 5 APRS (ऑटोमैटिक पैकेज रिपोर्टिंग सिस्टम)
और कुछ परिणाम मिले: मेरा जीथूब पृष्ठ
लेकिन यह पर्याप्त नहीं है। मुझे नहीं पता है कि घड़ी की रिकवरी, सिंक्रोनाइज़ेशन कैसे किया जाता है, ... (लिंक में टाइमिंग रिकवरी मैकेनिज्म के रूप में एक फेज़ लॉक्ड लूप है, लेकिन यह स्पष्ट रूप से पर्याप्त नहीं था)।
इसलिए मुझे लगता है कि मुझे एक सरल तरीका खोजना चाहिए। यहां एक लिंक मिला:
डेटा ऑडियो और वापस करने के लिए। स्रोत कोड के साथ मॉड्यूलेशन / डिमॉड्यूलेशन
लेकिन ओपी ने उत्तर में सुझाई गई विधि को लागू नहीं किया, इसलिए मुझे डर है कि यह बहुत जटिल हो सकता है। इसके अलावा मैं स्पष्ट रूप से जवाब में सुझाए गए डिकोडिंग विधि को नहीं समझता:
डिकोडर थोड़ा और अधिक जटिल है, लेकिन यहां एक रूपरेखा है:
वैकल्पिक रूप से बैंड-पास फ़िल्टर किए गए सिग्नल को 11Khz के आस-पास। यह एक शोर वातावरण में प्रदर्शन में सुधार करेगा। एफआईआर फ़िल्टर बहुत सरल हैं और कुछ ऑनलाइन डिज़ाइन एप्लेट हैं जो आपके लिए फ़िल्टर उत्पन्न करेंगे।
सिग्नल को थ्रेसहोल्ड करें। 1/2 अधिकतम आयाम के ऊपर प्रत्येक मान 1 है नीचे प्रत्येक मान 0 है। यह मान लिया है कि आपने पूरे संकेत का नमूना लिया है। यदि यह वास्तविक समय में है तो आप या तो एक निश्चित सीमा चुनते हैं या कुछ प्रकार के स्वचालित लाभ नियंत्रण करते हैं जहां आप कुछ समय के लिए अधिकतम सिग्नल स्तर को ट्रैक करते हैं।
डॉट या डैश की शुरुआत के लिए स्कैन करें। आप शायद नमूनों को एक बिंदु मानने के लिए अपने डॉट पीरियड में कम से कम 1 की निश्चित संख्या देखना चाहते हैं। फिर यह देखने के लिए स्कैन करें कि क्या यह डैश है। एक सही संकेत की उम्मीद न करें - आप अपने 1 के बीच में कुछ 0 और अपने 1 के बीच में कुछ 1 के बीच में देखेंगे। अगर थोड़ा शोर है तो "ऑफ" अवधि से "ऑन" अवधि को अलग करना काफी आसान होना चाहिए।
फिर उपरोक्त प्रक्रिया को उल्टा करें। यदि आप डैश को अपने बफर पर 1 बिट पुश करते देखते हैं, अगर एक डॉट एक शून्य को धक्का देता है।
मुझे समझ में नहीं आता कि कितने 1 के पहले इसे डॉट के रूप में वर्गीकृत किया गया है, ... इसलिए कई चीजें हैं जो मुझे अभी समझ में नहीं आती हैं। कृपया मुझे ध्वनि के माध्यम से डेटा संचारित करने के लिए एक सरल विधि का सुझाव दें ताकि मैं इस प्रक्रिया को समझ सकूं। आपका बहुत बहुत धन्यवाद :)
अपडेट करें:
मैंने कुछ मैटलैब कोड बनाए हैं जो कुछ हद तक (कुछ हद तक) चालू होते हैं। मैं पहले एम्पलीफिट शिफ्ट कीइंग (नमूना आवृत्ति 48000 हर्ट्ज, F_on = 5000 हर्ट्ज, बिट दर = 10 बिट्स / एस) का उपयोग करके सिग्नल को मॉड्यूलेट करता हूं, फिर इसे हेडर और एक एंड सीक्वेंस के साथ जोड़ते हैं (बेशक उन्हें अच्छी तरह से मॉड्यूलेट करें)। शीर्ष लेख और अंतिम अनुक्रम एक तदर्थ आधार पर चुना गया था (हाँ यह एक हैक था):
header = [0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1];
end_seq = [1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1];
फिर मैंने उन्हें ध्वनि के माध्यम से प्रसारित किया, और इसे अपने स्मार्टफोन के साथ रिकॉर्ड किया। फिर मैं रिकॉर्ड किए गए ऑडियो को अपने कंप्यूटर पर वापस भेजता हूं, ऑडियो पढ़ने के लिए एक और कोड का उपयोग करता हूं। तब मैं शुरुआत और अंत का पता लगाने के लिए संशोधित हेडर और एंडिंग सीक्वेंस के साथ प्राप्त सिग्नल (अभी तक डिमॉड्यूलेट नहीं) को सहसंबंधित करता हूं। उसके बाद मैं केवल प्रासंगिक संकेत लेता हूं (शुरुआत से अंत तक, जैसा कि सहसंबंध भाग में पाया जाता है)। फिर मैं डिजिटल डेटा को खोजने के लिए डिमोड्यूलेट और नमूना करता हूं। यहाँ 3 ऑडियो फ़ाइलें हैं:
"DigitalCommunication_ask": यहाँ लिंक यह पाठ "डिजिटल संचार" भेजता है। अपेक्षाकृत शोर-रहित हालांकि आप शुरुआत और अंत में कुछ पृष्ठभूमि शोर सुन सकते हैं। हालांकि परिणाम केवल "डिजिटल कॉम्मिनकैटियो" दिखा
"HelloWorld_ask": यहाँ लिंक यह पाठ "हैलो वर्ल्ड" भेजता है। "DigitalCommunication_ask" की तरह शोर मुक्त। हालांकि इस एक के लिए परिणाम सही था
"HelloWorld_noise_ask": यहाँ लिंक यह पाठ "हैलो दुनिया" भेजता है। हालांकि, कुछ शोर है जो मैंने बनाया है (मैंने ट्रांसमिशन के दौरान कुछ यादृच्छिक सामान "ए, बी, सी, डी, ई, ...." कहा है)। दुर्भाग्य से यह असफल रहा
यहाँ प्रेषक के लिए कोड है (प्रेषक।):
clear
fs = 48000;
F_on = 5000;
bit_rate = 10;
% header = [0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ];
% header = [0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 ];
header = [0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1];
% end_seq = [1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1];
% end_seq = [1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 ];
% end_seq = [0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0];
end_seq = [1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1];
num_of_samples_per_bit = round(fs / bit_rate);
modulated_header = ask_modulate(header, fs, F_on, bit_rate);
modulated_end_seq = ask_modulate(end_seq, fs, F_on, bit_rate);
% input_str = 'Ah';
input_str = 'Hello world';
ascii_list = double(input_str); % https://www.mathworks.com/matlabcentral/answers/298215-how-to-get-ascii-value-of-characters-stored-in-an-array
bit_stream = [];
for i = 1:numel(ascii_list)
bit = de2bi(ascii_list(i), 8, 'left-msb');
bit_stream = [bit_stream bit];
end
bit_stream = [header bit_stream end_seq];
num_of_bits = numel(bit_stream);
bandlimited_and_modulated_signal = ask_modulate(bit_stream, fs, F_on, bit_rate);
sound(bandlimited_and_modulated_signal, fs);
रिसीवर के लिए (रिसीवर दोपहर):
clear
fs = 48000;
F_on = 5000;
bit_rate = 10;
% header = [0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ];
% header = [0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 ];
header = [0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1];
% end_seq = [1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1];
% end_seq = [1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 ];
% end_seq = [0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0];
end_seq = [1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1];
modulated_header = ask_modulate(header, fs, F_on, bit_rate);
modulated_end_seq = ask_modulate(end_seq, fs, F_on, bit_rate);
% recObj = audiorecorder(fs,8,1);
% time_to_record = 10; % In seconds
% recordblocking(recObj, time_to_record);
% received_signal = getaudiodata(recObj);
% [received_signal, fs] = audioread('SounddataTruong_Ask.m4a');
% [received_signal, fs] = audioread('HelloWorld_noise_ask.m4a');
% [received_signal, fs] = audioread('HelloWorld_ask.m4a');
[received_signal, fs] = audioread('DigitalCommunication_ask.m4a');
ereceived_signal = received_signal(:)';
num_of_samples_per_bit = round(fs / bit_rate);
modulated_header = ask_modulate(header, fs, F_on, bit_rate);
modulated_end_seq = ask_modulate(end_seq, fs, F_on, bit_rate);
y= xcorr(modulated_header, received_signal); % do cross correlation
[m,ind]=max(y); % location of largest correlation
headstart=length(received_signal)-ind+1;
z = xcorr(modulated_end_seq, received_signal);
[m,ind]=max(z); % location of largest correlation
end_index=length(received_signal)-ind+1;
relevant_signal = received_signal(headstart + num_of_samples_per_bit * numel(header) : end_index - 1);
% relevant_signal = received_signal(headstart + num_of_samples_per_bit * numel(header): end);
demodulated_signal = ask_demodulate(relevant_signal, fs, F_on, bit_rate);
sampled_points_in_demodulated_signal = demodulated_signal(round(num_of_samples_per_bit / 2) : num_of_samples_per_bit :end);
digital_output = (sampled_points_in_demodulated_signal > (max(sampled_points_in_demodulated_signal(:)) / 2));
% digital_output = (sampled_points_in_demodulated_signal > 0.05);
% Convert to characters
total_num_of_bits = numel(digital_output);
total_num_of_characters = total_num_of_bits / 8;
first_idx = 0;
last_idx = 0;
output_str = '';
for i = 1:total_num_of_characters
first_idx = last_idx + 1;
last_idx = first_idx + 7;
binary_repr = digital_output(first_idx:last_idx);
ascii_value = bi2de(binary_repr(:)', 'left-msb');
character = char(ascii_value);
output_str = [output_str character];
end
output_str
ASK मॉड्यूलेशन कोड (ask_modulate):
function [bandlimited_and_modulated_signal] = ask_modulate(bit_stream, fs, F_on, bit_rate)
% Amplitude shift keying: Modulation
% Dang Manh Truong (dangmanhtruong@gmail.com)
num_of_bits = numel(bit_stream);
num_of_samples_per_bit = round(fs / bit_rate);
alpha = 0;
d_alpha = 2 * pi * F_on / fs;
A = 3;
analog_signal = [];
for i = 1 : num_of_bits
bit = bit_stream(i);
switch bit
case 1
for j = 1 : num_of_samples_per_bit
analog_signal = [analog_signal A * cos(alpha)];
alpha = alpha + d_alpha;
end
case 0
for j = 1 : num_of_samples_per_bit
analog_signal = [analog_signal 0];
alpha = alpha + d_alpha;
end
end
end
filter_order = 15;
LP_filter = fir1(filter_order, (2*6000)/fs, 'low');
bandlimited_analog_signal = conv(analog_signal, LP_filter,'same');
% plot(abs(fft(bandlimited_analog_signal)))
% plot(bandlimited_analog_signal)
bandlimited_and_modulated_signal = bandlimited_analog_signal;
end
ASK डिमॉड्यूलेशन (ask_demodulate.m) (मूल रूप से यह सिर्फ लिफाफा का पता लगाने के लिए है, जिसके लिए मैंने हिल्बर्टन का उपयोग किया था)
function [demodulated_signal] = ask_demodulate(received_signal, fs, F_on, bit_rate)
% Amplitude shift keying: Demodulation
% Dang Manh Truong (dangmanhtruong@gmail.com)
demodulated_signal = abs(hilbert(received_signal));
end
कृपया मुझे बताएं कि यह काम क्यों नहीं कर रहा है? आपका बहुत बहुत धन्यवाद