ฉันกำลังเขียนตัวอย่างเกี่ยวกับการส่งข้อมูลผ่านเสียงระหว่างคอมพิวเตอร์ 2 เครื่อง ข้อกำหนดบางประการ:
ระยะทางอยู่ใกล้มากนั่นคือคอมพิวเตอร์ 2 เครื่องนั้นอยู่ติดกัน
เสียงรบกวนน้อยมาก (ฉันไม่คิดว่าครูของฉันจะเปิดเพลงร็อคเป็นแหล่งเสียง)
ข้อผิดพลาดเป็นที่ยอมรับได้: ตัวอย่างเช่นถ้าฉันส่ง "การสื่อสารด้วยวิทยุ" ถ้าคอมพิวเตอร์อีกเครื่องได้รับ "RadiQ CommunEcation" ก็ไม่เป็นไร
ถ้าเป็นไปได้: ไม่มีส่วนหัว, ธง, checksum, .... เนื่องจากฉันต้องการตัวอย่างพื้นฐานที่แสดงให้เห็นถึงพื้นฐานของการส่งข้อมูลผ่านเสียง ไม่จำเป็นต้องแฟนซี
ฉันลองใช้การเปลี่ยนความถี่เสียงตามลิงค์นี้:
Lab 5 APRS (ระบบรายงานแพ็กเกจอัตโนมัติ)
และได้ผลลัพธ์บางส่วน: หน้า Github ของฉัน
แต่มันก็ไม่เพียงพอ ฉันไม่ทราบวิธีการกู้คืนนาฬิกาการซิงโครไนซ์ ... (ลิงก์มี Phase Locked Loop เป็นกลไกการกู้คืนเวลา แต่ดูเหมือนจะไม่เพียงพอ)
ดังนั้นฉันคิดว่าฉันควรหาวิธีที่ง่ายกว่า พบลิงค์ที่นี่:
ข้อมูลเสียงและกลับ Modulation / demodulation พร้อม source code
แต่ OP ไม่ได้ใช้วิธีการที่แนะนำในคำตอบดังนั้นฉันกลัวว่ามันอาจซับซ้อนมาก นอกจากนี้ฉันไม่เข้าใจวิธีการถอดรหัสที่แนะนำในคำตอบ:
ตัวถอดรหัสนั้นซับซ้อนกว่าเล็กน้อย แต่นี่เป็นโครงร่าง:
ตัวเลือก band-pass กรองสัญญาณตัวอย่างประมาณ 11Khz สิ่งนี้จะปรับปรุงประสิทธิภาพในสภาพแวดล้อมที่มีเสียงดัง ตัวกรอง FIR ค่อนข้างง่ายและมีแอปเพล็ตการออกแบบออนไลน์จำนวนน้อยที่จะสร้างตัวกรองสำหรับคุณ
เกณฑ์สัญญาณ ทุกค่าที่สูงกว่า 1/2 แอมพลิจูดสูงสุดคือ 1 ทุกค่าที่ต่ำกว่าคือ 0 ซึ่งถือว่าคุณสุ่มตัวอย่างสัญญาณทั้งหมดแล้ว หากเป็นแบบเรียลไทม์คุณจะเลือกเกณฑ์คงที่หรือทำการควบคุมการรับสัญญาณอัตโนมัติบางประเภทที่คุณติดตามระดับสัญญาณสูงสุดในบางช่วงเวลา
สแกนหาจุดเริ่มต้นหรือเส้นประ คุณอาจต้องการเห็นจำนวนอย่างน้อย 1 ในช่วงจุดของคุณเพื่อพิจารณาตัวอย่างจุด จากนั้นทำการสแกนต่อไปเพื่อดูว่านี่เป็นเส้นประหรือไม่ อย่าคาดหวังว่าสัญญาณที่สมบูรณ์แบบ - คุณจะเห็นว่ามีสักสองสามตัวที่อยู่ตรงกลางของ 1 และของคุณไม่กี่คนในช่วงกลางของ 0 ของคุณ หากมีเสียงรบกวนน้อยการแยกช่วงเวลา "เปิด" ออกจากช่วง "ปิด" ควรเป็นเรื่องง่าย
จากนั้นย้อนกลับกระบวนการข้างต้น หากคุณเห็นเส้นประผลักบิต 1 ไปยังบัฟเฟอร์ของคุณถ้าจุดกดศูนย์
ฉันไม่เข้าใจว่ามี 1 คนก่อนที่จะจัดประเภทเป็นจุด ... ดังนั้นจึงมีหลายสิ่งที่ฉันไม่เข้าใจในตอนนี้ กรุณาแนะนำให้ฉันวิธีง่ายๆในการส่งข้อมูลผ่านเสียงเพื่อให้ฉันสามารถเข้าใจกระบวนการ ขอบคุณมาก :)
UPDATE:
ฉันได้สร้างรหัส Matlab ซึ่งดูเหมือนว่าจะใช้งานได้บ้าง ฉันปรับสัญญาณโดยใช้ Amplitude shift keying (สุ่มตัวอย่างความถี่ 48000 Hz, F_on = 5,000 Hz, bit rate = 10 bits / 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];
จากนั้นฉันก็ส่งผ่านเสียงและบันทึกด้วยสมาร์ทโฟนของฉัน จากนั้นฉันก็ส่งเสียงที่บันทึกไว้กลับไปที่คอมพิวเตอร์ของฉันใช้โค้ดอีกชิ้นเพื่ออ่านเสียง จากนั้นฉันเชื่อมโยงสัญญาณที่ได้รับ (ยังไม่ demodulated) กับส่วนหัวมอดูเลตและลำดับตอนจบเพื่อค้นหาจุดเริ่มต้นและจุดสิ้นสุด หลังจากนั้นฉันจะรับสัญญาณที่เกี่ยวข้องเท่านั้น (ตั้งแต่ต้นจนจบตามที่พบในส่วนสหสัมพันธ์) จากนั้นฉันก็ทำการดีมอดูเลตและสุ่มตัวอย่างเพื่อค้นหาข้อมูลดิจิทัล นี่คือ 3 ไฟล์เสียง:
"DigitalCommunication_ask": ลิงค์ที่นี่มันส่งข้อความ "การสื่อสารแบบดิจิตอล" ไม่มีเสียงรบกวนแม้จะได้ยินเสียงพื้นหลังบ้างในตอนต้นและตอนท้าย อย่างไรก็ตามผลลัพธ์แสดงเฉพาะ "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 demodulation (ask_demodulate.m) (โดยทั่วไปเป็นเพียงการตรวจจับซองจดหมายซึ่งฉันใช้การแปลง Hilbert)
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
โปรดบอกฉันว่าทำไมมันไม่ทำงาน ขอบคุณมาก