62 lines
1.5 KiB
C++
62 lines
1.5 KiB
C++
#include "ModemFSK.h"
|
|
|
|
ModemFSK::ModemFSK() {
|
|
demodulatorCons.store(2);
|
|
currentDemodCons.store(0);
|
|
updateDemodulatorCons(2);
|
|
}
|
|
|
|
Modem *ModemFSK::factory() {
|
|
return new ModemFSK;
|
|
}
|
|
|
|
ModemKit *ModemFSK::buildKit(long long sampleRate, int audioSampleRate) {
|
|
ModemKitFSK *dkit = new ModemKitFSK;
|
|
dkit->m = 1;
|
|
dkit->k = sampleRate / 9600;
|
|
dkit->bandwidth = 7000.0 / sampleRate;
|
|
|
|
dkit->demodFSK = fskdem_create(dkit->m, dkit->k, dkit->bandwidth);
|
|
|
|
dkit->sampleRate = sampleRate;
|
|
dkit->audioSampleRate = audioSampleRate;
|
|
|
|
return dkit;
|
|
}
|
|
|
|
void ModemFSK::disposeKit(ModemKit *kit) {
|
|
ModemKitFSK *dkit = (ModemKitFSK *)kit;
|
|
|
|
delete dkit;
|
|
}
|
|
|
|
std::string ModemFSK::getName() {
|
|
return "FSK";
|
|
}
|
|
|
|
ModemFSK::~ModemFSK() {
|
|
|
|
}
|
|
|
|
void ModemFSK::updateDemodulatorCons(int cons) {
|
|
|
|
}
|
|
|
|
void ModemFSK::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) {
|
|
ModemKitFSK *dkit = (ModemKitFSK *)kit;
|
|
|
|
digitalStart(dkit, nullptr, input);
|
|
|
|
dkit->inputBuffer.insert(dkit->inputBuffer.end(),input->data.begin(),input->data.end());
|
|
|
|
while (dkit->inputBuffer.size() >= dkit->k) {
|
|
unsigned int sym_out;
|
|
|
|
sym_out = fskdem_demodulate(dkit->demodFSK, &dkit->inputBuffer[0]);
|
|
// std::cout << "ferror: " << fskdem_get_frequency_error(dkit->demodFSK) << std::endl;
|
|
printf("%01X", sym_out);
|
|
dkit->inputBuffer.erase(dkit->inputBuffer.begin(),dkit->inputBuffer.begin()+dkit->k);
|
|
}
|
|
|
|
digitalFinish(dkit, nullptr);
|
|
} |