2 কম্পিউটারের মধ্যে শব্দটির মাধ্যমে ডেটা প্রেরণ করুন (খুব কাছের দূরত্ব)


12

আমি সাউন্ড বিটওয়েন 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

দয়া করে বলুন কেন এটি কাজ করছে না? আপনাকে অনেক ধন্যবাদ


তত্ত্ব অনুসারে (শব্দহীন পরিবেশে) এটি প্রয়োগ করা তুচ্ছ হবে তবে বাস্তবে এটি অনেক বেশি কঠিন। তবুও, আপনি যে ধরণের তথ্য প্রেরণের চেষ্টা করছেন তার উপর এটি নির্ভর করে। পাঠ্যটি নির্ভরযোগ্যভাবে প্রেরণ করা অত্যন্ত কঠিন হবে কারণ এমনকি ক্ষুদ্রতম শব্দটিও পাঠ্যটিকে অপরিণয়যোগ্য করে তুলবে।
dsp_user

@dsp_user আমি পাঠ্য প্রেরণের চেষ্টা করছি। আমি কিছু ত্রুটির সাথে বাঁচতে পারি (যেমন "অডিও" -> "এপিডিও") :) এটিও আমি সত্যিই বুঝতে পারি না যে এমপ্লিটিউড শিফট কীিংয়ের জন্য উদাহরণস্বরূপ, যখন আপনার 1 রয়েছে তখন আপনি একটি সাইন ওয়েভ প্রেরণ করেন, 0 তবে কীভাবে কিছুই নয় আপনি কি প্রথম 0 জানেন? আমি একটি শব্দ-মুক্ত পরিবেশে বলতে চাইছি, তবে প্রথম 1 এর আগে 0 টি অনেক আছে? তাহলে কীভাবে জানবেন?
ডাং মানহ ট্রুং

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি ধারণার জন্য পুরানো ফ্যাশন 14.4 মডেমের মতো কিছু দেখুন।

@ স্ট্যানলিপাওলুকিউইচz আমি কিছুটা অগ্রগতি করেছি। আপডেট পরীক্ষা করুন। আপনাকে অনেক ধন্যবাদ.
ডাং মানহ ট্রুং

মন্তব্য করার মতো অনেক কিছুই আছে। আপনি উপস্থাপনের জন্য বার্কার সিকোয়েন্সগুলি দেখতে চাইতে পারেন, আপনি যে উপস্থাপনাগুলি ব্যবহার করছেন

উত্তর:


8

যেমন আপনি বুঝতে পেরেছেন, ডিজিটাল যোগাযোগ করার শক্ত অংশটি হল ক্যারিয়ার, প্রতীক এবং ফ্রেম সিঙ্ক্রোনাইজেশন এবং চ্যানেল অনুমান / সমীকরণ।

খারাপ খবরটি হ'ল আপনি এই সমস্যাগুলি ঘটাতে পারবেন না। সুসংবাদটি হ'ল এগুলি প্রয়োগ করা ততটা কঠিন নয়, যতক্ষণ না আপনি নিজেকে সঙ্কুচিত বিপিএসকে সীমাবদ্ধ রাখেন। আমি জানি, কারণ আমি নিজে এটি করেছি এবং আমার (আন্ডারগ্র্যাড) শিক্ষার্থীরাও রয়েছে (দেখুন http://ieeexplore.ieee.org/docament/5739249/ )

ক্যারিয়ারের সিঙ্ক্রোনাইজেশনের সমস্যাটি সমাধান করার জন্য একটি সহজ পরামর্শ হ'ল আপনার বেসব্যান্ড সিগন্যালটিকে আপকভার্ট করার জন্য এএম ডিএসবি-এলসি ব্যবহার করা। তারপরে, আপনি ক্যারিয়ার এবং ফেজ সিঙ্ক্রোনাইজেশন ছাড়াই একটি খাম আবিষ্কারক ব্যবহার করতে পারেন। এটি আপনার শক্তি দক্ষতায় ব্যয় করতে পারে তবে এটি আপনার ক্ষেত্রে অগ্রাধিকার নয়।

আর একটি সহজ পরামর্শ হ'ল "রিয়েল-টাইম প্রসেসিং" এর পরিবর্তে "ব্যাচ প্রসেসিং" করা; এর অর্থ কী, সম্পূর্ণ প্রাপ্ত সিগন্যালটি সংরক্ষণ করুন এবং পরে এটি প্রক্রিয়া করুন। এটি স্ট্রিম বা রিয়েল-টাইম প্রসেসিংয়ের চেয়ে প্রয়োগ করা আরও সহজ।

আমার আরও যথেষ্ট পরামর্শ এই বইটি পড়তে হবে: জনসন, শেথারেস এবং ক্লেইন, "সফটওয়্যার রিসিভার ডিজাইন", কেমব্রিজ। এটি রিসিভারের প্রতিটি একক অংশকে খুব স্পষ্টভাবে ব্যাখ্যা করে এবং এর মধ্যে মাতলাব কোডের প্রচুর উদাহরণ রয়েছে। স্টিভেন ট্রেটারের অনুরূপ একটি বই আছে, কোনও ডিএসপিতে যোগাযোগ ব্যবস্থা বাস্তবায়নের বিষয়ে (আমি এখনই সঠিক শিরোনামটি স্মরণ করতে পারি না)।

শুভকামনা; এবং দয়া করে আপনার কাছে নতুন, আরও নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করুন।


আমি তোমার কাগজ পড়েছি ভাল কাজগুলো করতে থাকো! একটি প্রশ্ন: কাগজে, আপনি শিক্ষার্থীরা চ্যানেলটির প্রতিক্রিয়া (অনুপ্রেরণা, সাইন ওয়েভ ব্যবহার করে ..) খুঁজে পেতে বিভিন্ন পদ্ধতি সম্পর্কে কথা বলেছেন। চ্যানেলটির প্রতিক্রিয়াও কি আমার খুঁজে পেতে হবে? :)
ডাং মানহ ট্রুং

1
আপনার দয়াবান শব্দের জন্য ধন্যবাদ :) বিষয়টি হ'ল আপনি নিশ্চিত করতে চান যে আপনি কোনও ফ্রিকোয়েন্সি ব্যান্ডের মাধ্যমে যেখানে চ্যানেলের প্রতিক্রিয়া সমতল; অন্যথায়, আপনি রিসিভারে একটি সমমানের প্রয়োজন need আপনি যদি চ্যানেলের প্রতিক্রিয়াটি অনুমান করতে না চান, আপনি যা করতে পারেন তা হ'ল একটি ফ্রিকোয়েন্সিতে খুব কম ডেটা রেট (বলুন, 100 বি / গুলি) যে সমস্ত অডিও উপকরণের সাথে আরামদায়ক হওয়া উচিত (বলুন, 5000 হার্জ)।
এমবাজ 16

1
@ ডাংম্যানহট্রুং আরও একটি বিষয়: ব্যান্ডউইথ-সীমাবদ্ধ ডাল যেমন স্কোয়ার-রুট উত্থিত কোসাইন ব্যবহার করবেন তা নিশ্চিত করুন, বড় ব্যান্ডউইথ রয়েছে এমন বর্গাকার ডাল নয় এবং সম্ভবত সম্ভবত বিকৃতিতে ক্ষতিগ্রস্থ হবে।
এমবিজেজ

আপনার পরামর্শ অনুসারে আমি বইটি সফ্টওয়্যার রিসিভার ডিজাইনটি পড়েছি (আসলে আমি এটির বেশিরভাগ অংশে স্কিমেড করেছিলাম এবং অধ্যায় 8: বিটস টু সিগন্যালগুলিতে মনোনিবেশ করেছি)। সুতরাং আমি কিছু প্রশ্ন আছে। আপনি ডাল সম্পর্কে কিছু বলেছেন, তবে বইয়ের উদাহরণে তারা একটি হামস উইন্ডোটিকে ডাল হিসাবে ব্যবহার করেছেন, আমি যদি তা করি তবে ঠিক আছে কি? এবং আমার বোঝাটি কি সঠিক: প্রথমে আপনি সিগন্যালটি ব্যবহার করে জিজ্ঞাসা করুন, বলুন, এসকে, তারপরে আপনি নাড়ির শেপিং ব্যবহার করুন। তারপরে রিসিভারে, আপনি প্রথমে সংশ্লেষিত সংকেতটি পাওয়ার জন্য নাড়ি সংকেতের সাথে সম্পর্কিত হন। তারপরে আপনি ধ্বংস করবেন। এটা কি সঠিক?
ডাং ম্যান ট্রুং

এবং যদি আমি শুরুতে এবং শেষে একটি শিরোনাম সহ প্যাকেট আকারে ডেটা প্রেরণ করতে চাই, 1 1 1 1 1 1 1 1 1 বলুন, তাই আমার এটি ডেটা যুক্ত করা উচিত, তারপরে এটি পরিবর্তন করুন, তারপরে এটি পালস আকার দিন। রিসিভারে, আমি প্রাপ্ত সিগন্যালটিকে নাড়ি আকারের (স্কোয়ার-রুট উত্থিত কোসাইন, ..) এর সাথে সম্পর্কযুক্ত করব, তারপরে আমাকে শিরোনামের সাথে সম্পর্কিত হওয়ার পরে সিগন্যালটি ডিমোডুলেট করতে হবে। আমার বোধগম্যতা কি সঠিক?
ডাং ম্যান ট্রুং

4

শেষ পর্যন্ত, আমি ডিটিএমএফ (ডুয়াল টোন মাল্টি ফ্রিকোয়েন্সি সংকেত) ব্যবহার করেছি। মূল ডিটিএমএফটিতে 2 টি ফ্রিকোয়েন্সি সংমিশ্রণ করে প্রতিটি 16 টি সংকেত রয়েছে। তবে এখানে আমি কেবল "1" (697 Hz এবং 1209 Hz) এবং "0" (941Hz এবং 1336 Hz) ব্যবহার করেছি

কোড কীভাবে কাজ করে তার একটি রূপরেখা:

  • প্রেরক পাঠ্যটিকে বাইনারি রূপান্তরিত করে, তারপর "0" / "1" টিটিএমএফ সংকেত প্রেরণ করে (এখানে সময়টি টোন সময়কালের জন্য 0.3, এবং স্বরের মধ্যে নীরবতার জন্য 0.1 সে)। সংক্রমণ কোডটি নেওয়া হয়েছে: https://sites.google.com/a/nd.edu/adsp-nik-kleber/home/advanced-digital-signal- প্রসেসিং / প্রজেক্ট ৩-- টাচ- টোন । স্পষ্টতই লেখক ডিজিটাল অসিলেটর বাস্তবায়নের জন্য প্রান্তিক স্থিতিশীল আইআইআর ফিল্টারটি ব্যবহার করেছিলেন।
  • গ্রাহক পক্ষ প্রথমে যথাক্রমে "0" এবং "1" ফ্রিকোয়েন্সি উপাদানগুলি নিষ্কাশন করতে 2 টি হাস্যকর-উচ্চ-অর্ডারযুক্ত এবং হাস্যকর-সংকীর্ণ ব্যান্ডপাস ফিল্টার ব্যবহার করে:

    ফিল্টার_র্ডার = 1000;

    one_band = [[((2696)/Fs) ((2698)/Fs)] [((21208)/Fs) ((21210)/Fs)]];
    
    one_dtmf_filter = fir1(filter_order, one_band);
    
    zero_band = [[((2940)/Fs) ((2942)/Fs)] [((21335)/Fs) ((21337)/Fs)]];
    
    zero_dtmf_filter = fir1(filter_order, zero_band);
    

এটি সম্পন্ন হওয়ার পরে আমরা প্রতিটি "1" এবং "0" সিগন্যালের শুরু এবং শেষ সন্ধান করব। কোডটি https://github.com/codyaray/dtmf-signaling থেকে । মূলত এটি নীরবতার সময়কালটি খুঁজে বের করে যা কমপক্ষে 10 এমএস এবং কোনও টোন পিরিয়ড 100 মিমি বেশি):

এখানে চিত্র বর্ণনা লিখুন

(উপরে থেকে নীচে: জিরো সিগন্যাল, গড় ফিল্টার সরানোর পরে সংকেত, প্রান্তিকের নীচের অংশগুলি সরিয়ে নেওয়ার পরে সংকেতের পার্থক্য)

  • প্রথমে পূর্ববর্তী পদক্ষেপের ফলাফলটি স্বাভাবিক করা হয় তবে চলমান গড় ফিল্টার দিয়ে যায় (ফিল্টার আকারের সাথে 10 মিমি * এফএস সমান হয়)। আমরা যদি ফলাফলটি প্লট করি আমরা দেখতে পাব যে "0" এবং "1" এর আকারটি পরিষ্কারভাবে দেখা যায়। সুতরাং আমি মনে করি যে এটি এ ক্ষেত্রে একটি খাম আবিষ্কারক হিসাবে কাজ করে।
  • তারপরে একটি নির্দিষ্ট প্রান্তিকের নীচে সমস্ত সংকেত কেটে দেওয়া হয়েছে (আমি 0.1 বেছে নিয়েছি)।
  • অবশেষে প্রান্তিকের উপরে সমস্ত ব্যবধানগুলি সন্ধান করুন যা সময়কাল 100 মিমি থেকে বড় হয় (নোট করুন যে চিত্রটি কোড থেকে পুনরুত্পাদনযোগ্য নয়, আপনাকে এটি তৈরি করতে প্রায় খনন করতে হবে)

তারপরে আমরা বিটগুলি একত্রিত করে আবার পাঠ্যে রূপান্তর করি :)

ভিডিও ডেমো: https://www.youtube.com/watch?v=vwQVmNnWa4s , যেখানে আমি আমার ল্যাপটপ এবং আমার ভাইয়ের পিসির মধ্যে "জিন চাও" লেখাটি প্রেরণ করছি :)

পি / এস: মূলত আমি এটি করেছি কারণ আমার ডিজিটাল যোগাযোগের শিক্ষক বলেছিলেন যে এই যে করেছে সে চূড়ান্ত পরীক্ষা না করেই একটি এ পাবে, তবে আমি কেবল পরীক্ষার পরে এটি করতে সক্ষম হয়েছি। সুতরাং এখানে আমার সমস্ত প্রচেষ্টা যায় :(

পি / এস 2: আমি একটি সি পেয়েছি :(


0

যদি আপনি খুব ভাল সিঙ্ক্রোনাইজেশন সহ একটি ওপেন সোর্স লাইব্রেরি চান, তবে আমি https://github.com/jgaeddert/liquid-dsp এর প্রস্তাব দিচ্ছি যা প্রান্তিককরণের জন্য msequence ব্যবহার করে, তারপরে সমতা তৈরি করে এবং পেডলোডকে কমিয়ে দেয়। আমি একটি অডিও মডেম তৈরি করেছি যা উপরের দিকে চলে এবং এটি বেশ ভালভাবে কাজ করে, তাই অন্য কিছু না হলে তরলের পদ্ধতিগুলি কিছুটা সহায়ক হওয়া উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.