mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2024-11-25 13:18:37 -05:00
Experimental de-emphasis option for FM-Stereo
This commit is contained in:
parent
5b4a348306
commit
604ce8cdf9
@ -48,8 +48,8 @@ ModemArgInfoList ModemFMStereo::getSettings() {
|
|||||||
|
|
||||||
std::vector<std::string> demphOptNames;
|
std::vector<std::string> demphOptNames;
|
||||||
demphOptNames.push_back("None");
|
demphOptNames.push_back("None");
|
||||||
demphOptNames.push_back("50μs");
|
demphOptNames.push_back("50us");
|
||||||
demphOptNames.push_back("75μs");
|
demphOptNames.push_back("75us");
|
||||||
demphArg.optionNames = demphOptNames;
|
demphArg.optionNames = demphOptNames;
|
||||||
|
|
||||||
std::vector<std::string> demphOpts;
|
std::vector<std::string> demphOpts;
|
||||||
@ -130,6 +130,24 @@ ModemKit *ModemFMStereo::buildKit(long long sampleRate, int audioSampleRate) {
|
|||||||
nco_crcf_reset(kit->stereoPilot);
|
nco_crcf_reset(kit->stereoPilot);
|
||||||
nco_crcf_pll_set_bandwidth(kit->stereoPilot, 0.25f);
|
nco_crcf_pll_set_bandwidth(kit->stereoPilot, 0.25f);
|
||||||
|
|
||||||
|
kit->demph = _demph;
|
||||||
|
|
||||||
|
if (_demph) {
|
||||||
|
float f = (1.0 / (2.0 * M_PI * double(_demph) * 1e-6));
|
||||||
|
float t = 1/(2* M_PI * f);
|
||||||
|
t = 1.0 / (2.0 * float(audioSampleRate) * tan(1.0 / (2.0 * float(audioSampleRate) * t)));
|
||||||
|
|
||||||
|
float tb = (1.0f + 2.0f * t * float(audioSampleRate));
|
||||||
|
float b_demph[2] = { 1.0f / tb, 1.0f / tb };
|
||||||
|
float a_demph[2] = { 1.0f, (1.0f - 2.0f * t * float(audioSampleRate)) / tb };
|
||||||
|
|
||||||
|
kit->iirDemphL = iirfilt_rrrf_create(b_demph, 2, a_demph, 2);
|
||||||
|
kit->iirDemphR = iirfilt_rrrf_create(b_demph, 2, a_demph, 2);
|
||||||
|
} else {
|
||||||
|
kit->iirDemphL = nullptr;
|
||||||
|
kit->iirDemphR = nullptr;
|
||||||
|
kit->demph = 0;
|
||||||
|
}
|
||||||
return kit;
|
return kit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,6 +161,8 @@ void ModemFMStereo::disposeKit(ModemKit *kit) {
|
|||||||
firhilbf_destroy(fmkit->firStereoR2C);
|
firhilbf_destroy(fmkit->firStereoR2C);
|
||||||
firhilbf_destroy(fmkit->firStereoC2R);
|
firhilbf_destroy(fmkit->firStereoC2R);
|
||||||
nco_crcf_destroy(fmkit->stereoPilot);
|
nco_crcf_destroy(fmkit->stereoPilot);
|
||||||
|
if (fmkit->iirDemphR) { iirfilt_rrrf_destroy(fmkit->iirDemphR); }
|
||||||
|
if (fmkit->iirDemphL) { iirfilt_rrrf_destroy(fmkit->iirDemphL); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -232,12 +252,24 @@ void ModemFMStereo::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInp
|
|||||||
audioOut->data.resize(numAudioWritten * 2);
|
audioOut->data.resize(numAudioWritten * 2);
|
||||||
for (size_t i = 0; i < numAudioWritten; i++) {
|
for (size_t i = 0; i < numAudioWritten; i++) {
|
||||||
float l, r;
|
float l, r;
|
||||||
|
float ld, rd;
|
||||||
firfilt_rrrf_push(fmkit->firStereoLeft, 0.568f * (resampledOutputData[i] - (resampledStereoData[i])));
|
|
||||||
firfilt_rrrf_execute(fmkit->firStereoLeft, &l);
|
if (fmkit->demph) {
|
||||||
|
iirfilt_rrrf_execute(fmkit->iirDemphL, 0.568f * (resampledOutputData[i] - (resampledStereoData[i])), &ld);
|
||||||
firfilt_rrrf_push(fmkit->firStereoRight, 0.568f * (resampledOutputData[i] + (resampledStereoData[i])));
|
iirfilt_rrrf_execute(fmkit->iirDemphR, 0.568f * (resampledOutputData[i] + (resampledStereoData[i])), &rd);
|
||||||
firfilt_rrrf_execute(fmkit->firStereoRight, &r);
|
|
||||||
|
firfilt_rrrf_push(fmkit->firStereoLeft, ld);
|
||||||
|
firfilt_rrrf_execute(fmkit->firStereoLeft, &l);
|
||||||
|
|
||||||
|
firfilt_rrrf_push(fmkit->firStereoRight, rd);
|
||||||
|
firfilt_rrrf_execute(fmkit->firStereoRight, &r);
|
||||||
|
} else {
|
||||||
|
firfilt_rrrf_push(fmkit->firStereoLeft, 0.568f * (resampledOutputData[i] - (resampledStereoData[i])));
|
||||||
|
firfilt_rrrf_execute(fmkit->firStereoLeft, &l);
|
||||||
|
|
||||||
|
firfilt_rrrf_push(fmkit->firStereoRight, 0.568f * (resampledOutputData[i] + (resampledStereoData[i])));
|
||||||
|
firfilt_rrrf_execute(fmkit->firStereoRight, &r);
|
||||||
|
}
|
||||||
|
|
||||||
audioOut->data[i * 2] = l;
|
audioOut->data[i * 2] = l;
|
||||||
audioOut->data[i * 2 + 1] = r;
|
audioOut->data[i * 2 + 1] = r;
|
||||||
|
@ -13,7 +13,11 @@ public:
|
|||||||
firfilt_rrrf firStereoLeft;
|
firfilt_rrrf firStereoLeft;
|
||||||
firfilt_rrrf firStereoRight;
|
firfilt_rrrf firStereoRight;
|
||||||
iirfilt_crcf iirStereoPilot;
|
iirfilt_crcf iirStereoPilot;
|
||||||
|
|
||||||
|
int demph;
|
||||||
|
iirfilt_rrrf iirDemphR;
|
||||||
|
iirfilt_rrrf iirDemphL;
|
||||||
|
|
||||||
firhilbf firStereoR2C;
|
firhilbf firStereoR2C;
|
||||||
firhilbf firStereoC2R;
|
firhilbf firStereoC2R;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user