(소프트웨어) 모뎀을 만드십시오!


14

객관적인

디자인 dulator / DEM odulator 쌍 가능한 한 빨리 이상의 시뮬레이션 정확하게 전송 데이터에 대한 기존 전화 서비스 (POTS)를 .

단계

  1. /dev/random전송하는 데 3-4 초가 걸리는 임의 ( 또는 이와 유사한) 데이터 생성
  2. 오디오 파일을 생성하기 위해 변조기로 데이터를 변조
  3. POTS 시뮬레이터를 통해 오디오 파일을 전달하십시오 . Python / Scipy가없는 경우 양식이 포함 된 파일을 업로드하거나 JSON API 요청을 수행 할 수 있습니다.
  4. 오디오 파일을 이진 데이터로 다시 복조
  5. 입력과 출력이 동일하다는 것을 확인하십시오 * (1000 비트 중 1 개가 손상 될 수 있음)
  6. 점수는 전송 된 비트 수를 오디오 파일 길이 (비트 / 초)로 나눈 값입니다.

규칙

  • 입력 파일은 3-4 초, 44.1 kHz, 모노 여야합니다.
  • SNR이 30dB 인 시뮬레이터를 실행합니다 (기본값).
  • 복조기는 10 -3 (1,000 비트 당 1) 이하의 비트 에러율로 전송 된 데이터를 재구성해야한다 .
  • 디지털 압축은 허용되지 않습니다 (예 : 데이터 압축). 문제의 범위를 벗어납니다.)
  • 4kHz 이상의 주파수로 데이터를 보내려고하지 않습니다. (필터가 완벽하지는 않지만 비교적 적은 수의 탭으로 POTS와 비슷합니다.)
  • 모뎀 프로토콜에 수신기를 동기화 / 보정하기 위해 짧은 프리앰블 (1 초 이하)이 필요한 경우에는 불이익을받지 않습니다.
  • 가능 하면 오디오 파일을 접근 할 수있는 곳에서 호스팅하여 신호음과 ops 소리를들을 수 있습니다.

다음 은 간단한 "온 오프 키잉"(오디오 샘플 포함)으로 변조 / 복조를 보여주는 예제 노트북 입니다.

점수는 100 (비트 / 초)입니다. 그것은 훨씬 더 나쁜 5dB SNR로 전송하고 있습니다.


2
이것은 일반적인 "이 바이너리 데이터 압축"문제와 다른가? 그렇다면 정확히 얼마나 다른지 명확히 할 수 있습니까?
Doorknob

1
여기서 데이터를 변조 (아날로그로 변환) 한 다음 그 반대입니다. 아마도 그것을 "아날로그 압축"이라고 부를 수 있습니다
Nick T

죄송하지만이 과제가 어떻게 작동하는지 잘 모르겠습니다. 링크 한 Wikipedia 기사에는 "modulate"라는 단어가 나타나지 않습니다. 더 많은 배경 정보를 포함 시키거나 사양을 명확하게 설명해 주시겠습니까?
Doorknob

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

1
이것은 대단한 도전입니다. 답변을 제출할 시간을 찾으려고 노력할 것입니다!
GoatInTheMachine

답변:


7

MATLAB, 1960bps

업데이트 된 시도는 다음과 같습니다.

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 비트 기간이지만 더 짧을 수 있음)이 있습니다. 나는 이것을 추출하고 복조를 위해 올바르게 위상 정현파와 코사인 반송파를 만들기 위해 복제했습니다. 매우 짧은 프리앰블이므로 지침에 따라 비트 레이트로 계산하지 않았습니다.

또한 첫 번째 시도 이후 QAM8 성상도를 사용하여 2 대신 기호 당 3 비트를 달성했습니다. 이는 전송 속도를 효과적으로 두 배로 늘립니다. ~ 2.4kHz 반송파를 사용하면 1960bps를 달성 할 수 있습니다.

또한 필터링으로 인한 느린 상승 시간의 영향을받지 않도록 기호 감지 기능을 개선했습니다. 기본적으로 각 비트주기의 후반 만 상승 시간의 영향을 제거하기 위해 평균화됩니다.

여전히 Shannon-Hartley 이론 의 40kbps 이론적 채널 대역폭 근처 (30dB SNR 가정)

끔찍한 소리 를 좋아하는 사람들을 위해 , 이것은 새로운 항목입니다.


누군가 관심이 있다면 이전 960bps 항목입니다.


스코어링은 전송 속도 일 뿐이므로 코드를 명확하게 유지하십시오. 재미 있으면 오디오 파일을 어딘가에 호스팅하라는 제안을 추가했습니다. : D
Nick T

오디오를 내 사이트에 업로드하겠습니다. 오히려 기분이 들립니다!
Tom Carpenter

@NickT 오디오 파일 업로드 됨-게시물 하단의 링크를 참조하십시오.
Tom Carpenter

SoundCloud 계정이있는 경우 오디오를 업로드하고 링크를 게시하면 게시물에서 재생할 수 있습니다. ( )
Calvin의 취미

@NickT 감사합니다. soundcloud 계정을 만들어 업로드했습니다. 또한 : 더블 데이터 속도와 업데이트 된 버전을 만들었어요
톰 목수에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.