একটি (সফ্টওয়্যার) মডেম তৈরি করুন!


14

উদ্দেশ্য

সিমুলেটেড প্লেইন পুরাতন টেলিফোন পরিষেবা (পটস) এর মাধ্যমে যত তাড়াতাড়ি সম্ভব ডেটা প্রেরণ করতে একটি মো ডিউলেটর / ডেম ওডুলেটর জোড় ডিজাইন করুন ।

ধাপ

  1. কিছু এলোমেলো ( /dev/randomবা মত) ডেটা তৈরি করুন যা প্রেরণে 3-4 সেকেন্ড সময় লাগবে
  2. অডিও ফাইল তৈরি করতে আপনার মডুলেটারের সাথে ডেটা মডিউল করুন
  3. পটস সিমুলেটারের মাধ্যমে অডিও ফাইলটি পাস করুন । পাইথন / স্কিপি না থাকলে আপনি ফর্মটি দিয়ে একটি ফাইল আপলোড করতে পারেন, বা একটি JSON এপিআই অনুরোধ করতে পারেন।
  4. বাইনারি ডেটাতে অডিও ফাইলটি পুনরায় তৈরি করুন
  5. বৈধতা দিন যে ইনপুট এবং আউটপুট সমান-ইশ * (প্রতি 1000 বিটের মধ্যে 1 টি সীমাবদ্ধ করা যেতে পারে)
  6. স্কোর হ'ল অডিও ফাইলের দৈর্ঘ্য (বিট / সেকেন্ড) দ্বারা বিভক্ত বিট সংখ্যা

বিধি

  • ইনপুট ফাইলটি অবশ্যই 3-4 সেকেন্ড, 44.1 kHz, মনো হতে হবে।
  • 30 ডিবি এর এসএনআর দিয়ে সিমুলেটরটি চালান (এটি ডিফল্ট)
  • ডেমোডুলেটরকে অবশ্যই 10 -3 (হাজার বিট প্রতি 1 টি) এর বিট ত্রুটির হারের সাথে সংক্রমণিত ডেটা পুনর্গঠন করতে হবে ।
  • কোনও ডিজিটাল সংক্ষেপণের অনুমতি নেই (যেমন ডেটা জিপ করা It's এটি চ্যালেঞ্জের আওতার বাইরে))
  • 4 কেএইচজেডের উপরে ফ্রিকোয়েন্সিগুলিতে ডেটা স্থানান্তরের চেষ্টা করছেন না। (আমার ফিল্টারগুলি নিখুঁত নয়, তবে তারা তুলনামূলকভাবে অল্প সংখ্যক ট্যাপের সাথে পটসের মতো রয়েছে like)
  • যদি আপনার মডেম প্রোটোকলটির রিসিভারকে সিঙ্ক্রোনাইজ / ক্যালিব্রেট করতে একটি সংক্ষিপ্ত preamble (1 সেকেন্ডের বেশি নয়) প্রয়োজন হয় তবে এটি দন্ডযুক্ত নয়।
  • যদি সম্ভব হয় তবে দয়া করে অ্যাক্সেসযোগ্য অডিও ফাইলটি কোথাও হোস্ট করুন যাতে আমরা বীপ এবং বুপের কাকফনি শুনতে পারি।

উদাহরণ

এখানে একটি উদাহরণ নোটবুক যা সাধারণ "অন-অফ কী" (অডিও নমুনাগুলি অন্তর্ভুক্ত!) দিয়ে মড্যুলেশন / ডেমোডুলেশন দেখায়।

এটি 100 (বিট / সেকেন্ড) স্কোর করবে। দ্রষ্টব্য যে এটি আরও খারাপ 5 ডিবি এসএনআর দিয়ে প্রেরণ করছে।


2
এটি কি একটি সাধারণ "এই বাইনারি ডেটা সংকোচনের" চ্যালেঞ্জের চেয়ে আলাদা? যদি তা হয়, তবে আপনি কতটা স্পষ্ট করে বলতে পারেন যে এটির চেয়ে আলাদা কী?
ডুরকনব

1
এখানে আপনি ডেটা মডিউল করছেন (এটিকে কিছুতে এনালগে রূপান্তর করা) তারপরে বিপরীত। যে কেউ একে "এনালগ সংক্ষেপণ" বলতে পারেন
নিক টি

দুঃখিত, আমি নিশ্চিত না যে আমি বুঝতে পারি যে এই চ্যালেঞ্জটি কীভাবে কাজ করে। "সংযুক্তি" শব্দটি আপনার লিঙ্ক করা উইকিপিডিয়া নিবন্ধেও আসে না। আপনি আরও পটভূমি তথ্য অন্তর্ভুক্ত করতে পারেন, বা চ্যানেল স্পষ্ট করতে?
ডুরকনব

4
wget wikipedia.org/Special:Random | grep title | texttospeech audio.wav speechtotext POTSaudio.wav | wget wikipedia/wiki/$text
TessellatingHeckler

1
এটি একটি দুর্দান্ত চ্যালেঞ্জ, আমি উত্তর জমা দেওয়ার সময়টি চেষ্টা করার চেষ্টা করব!
GoatInTheMachine

উত্তর:


7

ম্যাটল্যাব, 1960 বিপিএস

এখানে আমার আপডেট প্রচেষ্টা:

fs = 44100; %44.1kHz audio rate
fc = 2450;  %2.45kHz carrier - nice fraction of fs!
fsym = fc/5; %symbol rate

tmax = 4; %about 4 seconds worth

preamblesyms = 6;

t = 1/fs:1/fs:(tmax+preamblesyms/fsym);

symbols = preamblesyms+fsym*tmax;
symbollength = length(t)/symbols;
bits = symbols*3;
bitstream = [zeros(1,preamblesyms*3),rand(1,bits-preamblesyms*3)>0.5]; %Add a little preamble of 18 bits
data = bin2dec(char(reshape(bitstream,3,symbols)'+'0'))';

greycode = [0 1 3 2 6 7 5 4];

%Encode the symbols using QAM8 - we use effectively grey code so that
%adjacent symbols in the constellation have only one bit difference
%(minimises error rate)
encoded = zeros(2,symbols);
encoded(1,data==1) = 1/sqrt(2);
encoded(1,data==3) = 1;
encoded(1,data==2) = 1/sqrt(2);
encoded(1,data==7) = -1/sqrt(2);
encoded(1,data==5) = -1;
encoded(1,data==4) = -1/sqrt(2);
encoded(2,data==0) = 1;
encoded(2,data==1) = 1/sqrt(2);
encoded(2,data==2) = -1/sqrt(2);
encoded(2,data==6) = -1;
encoded(2,data==7) = -1/sqrt(2);
encoded(2,data==4) = 1/sqrt(2);

%Modulate onto carrier
carrier = [sin(2*pi*fc*t);cos(2*pi*fc*t)];
signal = reshape(repmat(encoded(1,:)',1,symbollength)',1,[]);
signal(2,:) = reshape(repmat(encoded(2,:)',1,symbollength)',1,[]);
modulated = sum(signal.*carrier)';

%Write out an audio file
audiowrite('audio.wav',modulated,fs);

%Wait for the user to run through the POTS simulator
input('');

%Read in the filtered data
filtered=audioread('audio.pots-filtered.wav')';

%Recover the two carrier signals
preamblecos = filtered(symbollength+1:symbollength*2);
preamblesin = filtered(symbollength+1+round(symbollength*3/4):symbollength*2+round(symbollength*3/4));

%Replicated the recovered carriers for all symbols
carrierfiltered = [repmat(preamblesin,1,symbols);repmat(preamblecos,1,symbols)];

%Generate a demodulation filter (pass up to 0.66*fc, stop at 1.33*fc
%(really we just need to kill everything around 2*fc where the alias ends up)
d=fdesign.lowpass('Fp,Fst,Ap,Ast',0.05,0.1,0.5,60);
Hd = design(d,'equiripple');

%Demodulate the incoming stream
demodulated = carrierfiltered .* [filtered;filtered];
demodulated(1,:)=filtfilt(Hd.Numerator,1,demodulated(1,:));
demodulated(2,:)=filtfilt(Hd.Numerator,1,demodulated(2,:));

%Split signal up into bit periods
recovereddemodulated=[];
recovereddemodulated(1,:,:) = reshape(demodulated(1,:),symbollength,symbols);
recovereddemodulated(2,:,:) = reshape(demodulated(2,:),symbollength,symbols);

%Extract the average level for each bit period. Only look at the second
%half to account for slow rise times in the signal due to filtering
recoveredsignal=mean(recovereddemodulated(1,round(symbollength/2):symbollength,:));
recoveredsignal(2,:)=mean(recovereddemodulated(2,round(symbollength/2):symbollength,:));

%Convert the recovered signal into a complex number.
recoveredsignal=recoveredsignal(2,:) + 1j*recoveredsignal(1,:);

%Determine the magnitude and angle of the symbol. The phase is normalised
%to pi/4 as that is the angle between the symbols. Rounding this to the
%nearest integer will tell us which of the 8 phases it is closest to
recoveredphase = round(angle(recoveredsignal)/(pi/4));
recoveredphase = mod(recoveredphase+8,8)+1; %Remap to an index in the grey code vector.

%Determine the symbol in the QAM8 constellation
recoveredencoded=greycode(recoveredphase);
recoveredencoded(1:preamblesyms)=0; %Assume the preamble is correct for comparison

%Turn it back in to a bit stream
bitstreamRecovered = reshape(dec2bin(recoveredencoded)'-'0',1,[]);

%And check if they are all correct...
if(all(bitstream==bitstreamRecovered))
    disp(['Woop, ' num2str(fsym*4) 'bps']);
else
    error('Its corrupt Jim.');
end

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

এছাড়াও প্রথম প্রয়াসের পরে আমি এখন 2 এর পরিবর্তে প্রতীক প্রতি 3 বিট অর্জনের জন্য একটি QAM8 নক্ষত্র ব্যবহার করছি This এটি কার্যকরভাবে স্থানান্তর হারকে দ্বিগুণ করে। সুতরাং একটি 4 2.4kHz ক্যারিয়ারের সাথে আমি এখন 1960bps অর্জন করছি।

আমি প্রতীক সনাক্তকরণকেও উন্নত করেছি যাতে ফিল্টারিংয়ের ফলে আস্তে আস্তে গড় বৃদ্ধির ফলে গড়টি প্রভাবিত না হয় - মূলত প্রতিটি বিট পিরিয়ডের কেবলমাত্র দ্বিতীয়ার্ধের গড় বৃদ্ধি বারের প্রভাব অপসারণের জন্য গড় হয়।

শ্যানন-হার্টলি তত্ত্ব (30 ডিবি এসএনআর ধরে) থেকে 40 কেবিপিএস তাত্ত্বিক চ্যানেল ব্যান্ডউইথের কাছে এখনও কোথাও নেই

যারা ভয়াবহ শব্দ পছন্দ করেন তাদের জন্য এটিই নতুন প্রবেশিকা:


এবং যদি কেউ আগ্রহী হয় তবে এটি পূর্ববর্তী 960PS এন্ট্রি


স্কোরিং হ'ল স্থানান্তর হার, সুতরাং আপনার কোডটি পরিষ্কার রাখুন। আপনার অডিও ফাইলটি মজাদারদের পক্ষে সহজ হলে কোথাও হোস্ট করার জন্য আমি একটি পরামর্শ যুক্ত করেছি: ডি
নিক টি টি

আমি অডিওটি আমার সাইটে আপলোড করব। এটা বরং আনন্দদায়ক শোনাচ্ছে!
টম কার্পেন্টার

@ নিকটি অডিও ফাইল আপলোড করা হয়েছে - পোস্টের নীচে লিঙ্কটি দেখুন।
টম কার্পেন্টার

আপনার যদি একটি সাউন্ডক্লাউড অ্যাকাউন্ট থাকে আপনি নিজের অডিও আপলোড করতে পারেন এবং একটি লিঙ্ক পোস্ট করতে পারেন এবং এটি আপনার পোস্টে প্লে হবে। ( উদাহরণ )
ক্যালভিনের শখ 5

@ নিকট ধন্যবাদ। আমি একটি সাউন্ডক্লাউড অ্যাকাউন্ট তৈরি করেছি এবং এটি আপলোড করেছি। আমি দ্বিগুণ ডেটা হারের সাথে একটি আপডেট সংস্করণও তৈরি করেছি :)
টম কার্পেন্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.