두 대의 컴퓨터 사이에서 사운드를 통해 데이터를 전송하는 예를 쓰고 있습니다. 일부 요구 사항 :
거리는 매우 가깝습니다. 즉, 2 대의 컴퓨터가 기본적으로 서로 인접 해 있습니다.
소음이 거의 없음 (선생님이 록 소스를 소음원으로 사용하지 않을 것 같습니다)
예를 들어 "Radio communication"을 보내면 다른 컴퓨터가 "RadiQ communEcation"을 수신해도 괜찮습니다.
가능한 경우 : 헤더, 플래그, 체크섬 등이 없습니다. 사운드를 통해 데이터를 전송하는 기본 사항을 보여주는 매우 기본적인 예를 원하기 때문입니다. 화려할 필요는 없습니다.
이 링크에 따라 Audio Frequency Shift Keying을 사용해 보았습니다.
결과가 나타납니다 : My Github 페이지
그러나 충분하지 않습니다. 나는 시계 복구, 동기화, ...를 수행하는 방법을 모른다.
그래서 나는 더 간단한 접근법을 찾아야한다고 생각합니다. 여기에 링크가 있습니다 :
데이터를 오디오 및 백으로. 소스 코드를 이용한 변조 / 복조
그러나 OP는 답변에서 제안 된 방법을 구현하지 않았으므로 매우 복잡 할 수 있습니다. 또한 대답에서 제안 된 디코딩 방법을 명확하게 이해하지 못합니다.
디코더는 조금 더 복잡하지만 개요는 다음과 같습니다.
선택적으로 11Khz 주변에서 샘플링 된 신호를 대역 통과 필터링합니다. 시끄러운 환경에서 성능이 향상됩니다. FIR 필터는 매우 간단하며 필터를 생성하는 몇 가지 온라인 디자인 애플릿이 있습니다.
신호 임계 값. 1/2 최대 진폭을 초과하는 모든 값은 1이며, 아래 모든 값은 0입니다. 이는 전체 신호를 샘플링 한 것으로 가정합니다. 이것이 실시간 인 경우 고정 임계 값을 선택하거나 일정 시간 동안 최대 신호 레벨을 추적하는 일종의 자동 게인 제어를 수행합니다.
도트 또는 대시의 시작을 스캔하십시오. 샘플을 도트로 간주하기 위해 도트주기에서 적어도 1의 특정 수를보고 싶을 것입니다. 그런 다음 스캔을 계속하여 대시인지 확인하십시오. 완벽한 신호를 기대하지 마십시오. 1의 중간에 몇 개의 0이 있고 0의 중간에 몇 개의 1이 보일 것입니다. 노이즈가 적 으면 "켜기"기간과 "끄기"기간을 구분하는 것이 매우 쉽습니다.
그런 다음 위 과정을 반대로하십시오. 대시가 버퍼에 1 비트를 밀어 넣으면 도트가 0을 밀어 넣으십시오.
나는 그것을 점으로 분류하기 전에 얼마나 많은 1을 이해하지 못합니다 ... 그래서 지금 이해하지 못하는 것이 많이 있습니다. 프로세스를 이해할 수 있도록 사운드를 통해 데이터를 전송하는 간단한 방법을 제안하십시오. 대단히 감사합니다 :)
최신 정보:
(일부) 작동하는 것처럼 보이는 Matlab 코드를 만들었습니다. 먼저 진폭 시프트 키잉 (샘플링 주파수 48000Hz, F_on = 5000Hz, 비트 레이트 = 10 비트 / s)을 사용하여 신호를 변조 한 다음 헤더와 종료 시퀀스를 추가하여 신호를 추가합니다 (물론 변조). 헤더와 종료 시퀀스는 임시로 선택되었습니다 (예 : 핵).
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": 여기에 링크 하면 "Digital communication"이라는 텍스트가 전송됩니다. 처음과 끝에서 약간의 배경 소음을들을 수 있지만 비교적 소음이 없습니다. 그러나 결과는 "Digital Commincatio"만 보여주었습니다.
"HelloWorld_ask": 여기에 링크 하면 "Hello world"라는 텍스트가 전송됩니다. "DigitalCommunication_ask"와 같은 잡음이 없습니다. 그러나이 결과는 정확했습니다.
"HelloWorld_noise_ask": 여기에 링크 하여 "Hello world"텍스트를 보냅니다. 그러나 내가 만든 약간의 소음이 있습니다 (전송 중에 임의의 물건 "A, B, C, D, E, ...."라고 말한 것입니다). 불행히도이 하나는 실패
발신자 코드 (sender.m)는 다음과 같습니다.
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);
수신자 (receiver.m)의 경우 :
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
왜 작동하지 않습니까? 대단히 감사합니다