আমি সাউন্ড বিটওয়েন 2 কম্পিউটারের মাধ্যমে ডেটা প্রেরণে একটি উদাহরণ লিখছি। কিছু প্রয়োজনীয়তা:
দূরত্বটি খুব কাছে, অর্থাত্ 2 টি কম্পিউটার মূলত একে অপরের সাথে সংলগ্ন
খুব অল্প আওয়াজ (আমি মনে করি না যে আমার শিক্ষক একটি রক গানটি শব্দের উত্স হিসাবে চালু করবেন)
ত্রুটিটি গ্রহণযোগ্য: উদাহরণস্বরূপ যদি আমি "রেডিও যোগাযোগ" প্রেরণ করি তবে অন্য কম্পিউটারটি যদি "রেডিকিউ যোগাযোগ" গ্রহণ করে তবে তা ঠিক আছে।
যদি সম্ভব হয়: শিরোনাম, পতাকা, চেকসাম নেই, .... যেহেতু আমি কেবলমাত্র একটি খুব মৌলিক উদাহরণ চাই যা শব্দের মাধ্যমে ডেটা সংক্রমণের মূল বিষয়গুলি দেখায়। অভিনব হওয়ার দরকার নেই।
আমি এই লিঙ্কটি অনুযায়ী অডিও ফ্রিকোয়েন্সি শিফট কী ব্যবহার করার চেষ্টা করেছি:
ল্যাব 5 এপিআরএস (স্বয়ংক্রিয় প্যাকেজ রিপোর্টিং সিস্টেম)
এবং কিছু ফলাফল পেয়েছে: আমার গিথুব পৃষ্ঠা
কিন্তু এটা যথেষ্ট নয়. আমি কীভাবে ঘড়িটি পুনরুদ্ধার, সিঙ্ক্রোনাইজেশন করব তা জানি না ... (লিঙ্কটিতে সময় পুনরুদ্ধারের ব্যবস্থা হিসাবে ফেজ লকড লুপ রয়েছে তবে এটি দৃশ্যত যথেষ্ট ছিল না)।
সুতরাং আমি মনে করি আমার একটি সহজ পদ্ধতির সন্ধান করা উচিত। এখানে একটি লিঙ্ক পাওয়া গেছে:
অডিও এবং পিছনে ডেটা। সোর্স কোড সহ মডুলেশন / ডেমোডুলেশন
তবে ওপি উত্তরে প্রস্তাবিত পদ্ধতিটি কার্যকর করেনি, তাই আমি ভয় করি এটি খুব জটিল হতে পারে। এছাড়াও আমি উত্তরে প্রস্তাবিত ডিকোডিং পদ্ধতিটি পরিষ্কারভাবে বুঝতে পারি না:
ডিকোডার কিছুটা জটিল তবে এখানে একটি রূপরেখা রয়েছে:
বিকল্প হিসাবে ব্যান্ড-পাস 11Khz কাছাকাছি নমুনাযুক্ত সংকেত ফিল্টার। এটি একটি কোলাহলপূর্ণ viর্ষায় কর্মক্ষমতা উন্নত করবে। এফআইআর ফিল্টারগুলি বেশ সহজ এবং কয়েকটি অনলাইন ডিজাইনের অ্যাপলেট রয়েছে যা আপনার জন্য ফিল্টার তৈরি করবে।
সিগন্যালটি প্রসারিত করুন। 1/2 সর্বাধিক প্রশস্ত পরিমাণের উপরে প্রতিটি মান নীচের প্রতিটি মান 0 হয় This এটি ধরে নেওয়া হয় আপনি পুরো সংকেতকে নমুনা দিয়েছেন। যদি এটি আসল সময়ে হয় আপনি হয় একটি নির্দিষ্ট প্রান্তিক বাছাই করে বা কিছু ধরণের স্বয়ংক্রিয় লাভ নিয়ন্ত্রণ করেন যেখানে আপনি কিছু সময়ের মধ্যে সর্বোচ্চ সিগন্যাল স্তরটি ট্র্যাক করেন।
বিন্দু বা ড্যাশ শুরু করার জন্য স্ক্যান করুন। নমুনাগুলিকে বিন্দু হিসাবে বিবেচনা করতে আপনি সম্ভবত আপনার ডট পিরিয়ডে কমপক্ষে 1 এর একটি নির্দিষ্ট সংখ্যা দেখতে চান to তারপরে স্ক্যান করে রাখুন এটি কোনও ড্যাশ কিনা। নিখুঁত সংকেত আশা করবেন না - আপনি আপনার 1 এর মাঝখানে কয়েকটি 0 এবং আপনার 0 এর মাঝখানে কয়েকটি 1 দেখতে পাবেন। যদি কিছুটা আওয়াজ হয় তবে "অফ" পিরিয়ড থেকে "অন" পিরিয়ডের পার্থক্য করা মোটামুটি সহজ হওয়া উচিত।
তারপরে উপরের প্রক্রিয়াটি বিপরীত করুন। আপনি যদি ড্যাশ দেখতে পান তবে আপনার বাফারে 1 বিট চাপুন, যদি কোনও বিন্দু শূন্যের দিকে চাপ দেয়।
আমি এটিকে বিন্দু হিসাবে শ্রেণিবদ্ধ করার আগে কতজনকে বুঝতে পারি না ... তাই অনেক কিছুই আছে যা আমি এখনই বুঝতে পারি না। শব্দটির মাধ্যমে ডেটা সংক্রমণ করার জন্য দয়া করে আমাকে একটি সহজ পদ্ধতি প্রস্তাব করুন যাতে আমি প্রক্রিয়াটি বুঝতে পারি। আপনাকে অনেক ধন্যবাদ :)
হালনাগাদ:
আমি কিছু মতলব কোড তৈরি করেছি যা প্রদর্শিত হবে (কিছুটা) কার্যকর হবে। আমি প্রথমে এমপ্লিটিউড শিফট কী (স্যাম্পলিং ফ্রিকোয়েন্সি 48000 হার্জেড, এফ_ন = 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 টি অডিও ফাইল রয়েছে:
"ডিজিটালকমিনিকেশন_স্ক্ক": এখানে লিঙ্কটি এটি "ডিজিটাল যোগাযোগ" পাঠ্য পাঠায়। তুলনামূলকভাবে শব্দহীন মুক্ত যদিও আপনি শুরু এবং শেষে কিছু পটভূমির শব্দ শুনতে পাচ্ছেন। তবে ফলাফলটি কেবল "ডিজিটাল কম্মিনকাটিও" দেখিয়েছে
" হ্যালো ওয়ার্ল্ড_আস্ক" : এখানে লিঙ্কটি এটি "হ্যালো ওয়ার্ল্ড" পাঠ্যটি পাঠায়। "ডিজিটালকমিনিউশন_াস্ক" এর মতো শোরগোল মুক্ত। তবে এটির জন্য ফলাফলটি সঠিক ছিল
" হ্যালো ওয়ার্ল্ড_নিউজ_আস্ক" : এখানে লিঙ্কটি এটি "হ্যালো ওয়ার্ল্ড" পাঠ্যটি পাঠায়। তবে আমি কিছু শব্দ করেছি যা আমি প্রেরণের সময় কিছু এলোমেলো জিনিস "এ, বি, সি, ডি, ই, ...." বলেছিলাম) দুর্ভাগ্যক্রমে এই ব্যর্থ হয়েছে
এখানে প্রেরকের কোড (প্রেরক.এম):
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
এএসকে মড্যুলেশন কোড (জিজ্ঞাসা_আরজনিত):
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
দয়া করে বলুন কেন এটি কাজ করছে না? আপনাকে অনেক ধন্যবাদ