Но это и показалось мне интересным.

Если кто не знает, FSK - это Frequency-shift keying - кодирование со сдвигом часоты, или,
как чаще его норовят назвать сегодня - DTMF (Dual Tone Multifrequency).
Этот замечательный формат передачи данных известен также как стандарт Kansas City
(KCS), где он был утверждён на симпозиуме в далёком 1975 году,
в качестве основного формата записи данных на магнитную ленту.
Кассетные накопители были выбраны как дешевый носитель данных и FSK был рекомендован
для обмена на магнитофонных кассетах.
FSK в KCS использовал кодирование с частотным сдвигом. Логическому нулю соответствовали
4 периода колебаний с частотой 1200 Гц, единице восемь периодов с частотой 2400 Гц.

Каждый байт обрамлялся ведущим нулём и двумя замыкающими единицами, то есть расширялся
до 11 знаков; коррекция ошибок не предусматривалась.
Впоследствии скорость записи-воспроизведения была повышена до 600 и 1200 бод. Домашние
персональные компьютеры конца 1970-х и начала 1980-х годов, как правило, имели встроенный
интерфейс для сохранения данных на обычных кассетных магнитофонах.
Я впервые встретил этот формат в Мониторе DDT кооператива "SP-580" из г.Барнаул (Лукин, Титков),
и скажу, что FSK давал большую фору фазовой манипуляции от "Радио РК-86" по надёжности,
по уровню непритязательности к носителю, магнитофону и помехам!
При явной детонации типа "вау-вау" программы "Специалиста" от "SP-580" успешно считывались!
Но это всё было давно... А причём же Arduino?
Господин Mark VandeWettering вспомнил о формате FSK, работая с передачей данных по
лучу лазера, управляемого Arduino!
И древний стандарт пришелся "старому динозавру" ко двору!

Он почесал в затылке... погладил лысину... подсмотрел в шпаргалку... и всё-таки реализовалMark wrote:Since I am old, I remember the old days ... It’s amazing we ever lived through the stone age.
протокол FSK на Цэ.

Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sndfile.h>
/*
* kc.c
* A program which takes a file as input, and encodes it via the old
* Kansas City Standard - a 300 baud format that was used by old
* microcomputers to store data onto cassette tape.
*
* http://en.wikipedia.org/wiki/Kansas_City_standard
*
* We are going to produce a 9600 sample per second output file...
*
* Each "baud" is 32 samples long.
*
* A '0' is 4 cycles @ 1200 Hz.
* A '1' is 8 cycles @ 2400 Hz.
*
* 0 - 0 R2 1 R2 0 -R2 -1 -R2
* 1 - 0 1 0 -1
*
*/
#define R2 (.70710678118654752440f)
SNDFILE *sf ;
SF_INFO sfinfo ;
void
output(float f)
{
sf_write_float(sf, &f, 1) ;
}
void
send(int bit)
{
int c ;
switch (bit) {
case 0:
for (c=0; c<4; c++) {
output(0.f) ;
output(R2) ;
output(1.f) ;
output(R2) ;
output(0.f) ;
output(-R2) ;
output(-1.f) ;
output(-R2) ;
}
break ;
case 1:
for (c=0; c<8; c++) {
output(0.f) ;
output(1.f) ;
output(0.f) ;
output(-1.f) ;
}
break ;
default:
abort() ;
}
}
void
encode(int ch)
{
int i ;
send(0) ; /* start bit... */
for (i=0; i<8; i++) {
send(ch & 1) ;
ch = ch >> 1 ;
}
send(1) ; /* two stop bits */
send(1) ;
}
main()
{
int i, ch ;
sfinfo.channels = 1 ;
sfinfo.samplerate = 9600 ;
sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ;
sf = sf_open("test.wav", SFM_WRITE, &sfinfo) ;
for (i=0; i<9600/4; i++)
output(0.) ;
while ((ch = getchar()) != EOF)
encode(ch) ;
for (i=0; i<9600/4; i++)
output(0.) ;
sf_close(sf) ;
}

PS. А лично я опять столкнулся с FSK и "тэйпрекодерами", когда мы с Виталием
засомневались - сколько данных влезает на 60 мин кассету у "Т3-29".
(свыше 200 КБайт с двух сторон по стандарту и 72 КБайт на 1 сторону у "Т3-29").

PPS. Кстати говоря, метод фазовой манипуляции в "Радио РК-86" носит название "Манчестерское кодирование":
https://ru.wikipedia.org/wiki/Физическое_кодирование
https://ru.wikipedia.org/wiki/Манчестерское_кодирование