mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-16 13:37:47 -04:00
Possible fix for ModemFMStereo singleton init crash edge case.
This commit is contained in:
parent
1cd8759880
commit
0f82d24d44
@ -2,20 +2,10 @@
|
|||||||
|
|
||||||
ModemFMStereo::ModemFMStereo() {
|
ModemFMStereo::ModemFMStereo() {
|
||||||
demodFM = freqdem_create(0.5);
|
demodFM = freqdem_create(0.5);
|
||||||
|
|
||||||
firStereoR2C = firhilbf_create(5, 60.0f);
|
|
||||||
firStereoC2R = firhilbf_create(5, 60.0f);
|
|
||||||
|
|
||||||
stereoPilot = nco_crcf_create(LIQUID_VCO);
|
|
||||||
nco_crcf_reset(stereoPilot);
|
|
||||||
nco_crcf_pll_set_bandwidth(stereoPilot, 0.25f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ModemFMStereo::~ModemFMStereo() {
|
ModemFMStereo::~ModemFMStereo() {
|
||||||
firhilbf_destroy(firStereoR2C);
|
freqdem_destroy(demodFM);
|
||||||
firhilbf_destroy(firStereoC2R);
|
|
||||||
|
|
||||||
nco_crcf_destroy(stereoPilot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ModemFMStereo::getType() {
|
std::string ModemFMStereo::getType() {
|
||||||
@ -90,6 +80,13 @@ ModemKit *ModemFMStereo::buildKit(long long sampleRate, int audioSampleRate) {
|
|||||||
|
|
||||||
kit->iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As);
|
kit->iirStereoPilot = iirfilt_crcf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_BANDPASS, LIQUID_IIRDES_SOS, order, fc, f0, Ap, As);
|
||||||
|
|
||||||
|
kit->firStereoR2C = firhilbf_create(5, 60.0f);
|
||||||
|
kit->firStereoC2R = firhilbf_create(5, 60.0f);
|
||||||
|
|
||||||
|
kit->stereoPilot = nco_crcf_create(LIQUID_VCO);
|
||||||
|
nco_crcf_reset(kit->stereoPilot);
|
||||||
|
nco_crcf_pll_set_bandwidth(kit->stereoPilot, 0.25f);
|
||||||
|
|
||||||
return kit;
|
return kit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,6 +97,9 @@ void ModemFMStereo::disposeKit(ModemKit *kit) {
|
|||||||
msresamp_rrrf_destroy(fmkit->stereoResampler);
|
msresamp_rrrf_destroy(fmkit->stereoResampler);
|
||||||
firfilt_rrrf_destroy(fmkit->firStereoLeft);
|
firfilt_rrrf_destroy(fmkit->firStereoLeft);
|
||||||
firfilt_rrrf_destroy(fmkit->firStereoRight);
|
firfilt_rrrf_destroy(fmkit->firStereoRight);
|
||||||
|
firhilbf_destroy(fmkit->firStereoR2C);
|
||||||
|
firhilbf_destroy(fmkit->firStereoC2R);
|
||||||
|
nco_crcf_destroy(fmkit->stereoPilot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -143,11 +143,11 @@ void ModemFMStereo::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInp
|
|||||||
|
|
||||||
for (size_t i = 0; i < bufSize; i++) {
|
for (size_t i = 0; i < bufSize; i++) {
|
||||||
// real -> complex
|
// real -> complex
|
||||||
firhilbf_r2c_execute(firStereoR2C, demodOutputData[i], &x);
|
firhilbf_r2c_execute(fmkit->firStereoR2C, demodOutputData[i], &x);
|
||||||
|
|
||||||
// 19khz pilot band-pass
|
// 19khz pilot band-pass
|
||||||
iirfilt_crcf_execute(fmkit->iirStereoPilot, x, &v);
|
iirfilt_crcf_execute(fmkit->iirStereoPilot, x, &v);
|
||||||
nco_crcf_cexpf(stereoPilot, &w);
|
nco_crcf_cexpf(fmkit->stereoPilot, &w);
|
||||||
|
|
||||||
w.imag = -w.imag; // conjf(w)
|
w.imag = -w.imag; // conjf(w)
|
||||||
|
|
||||||
@ -159,15 +159,15 @@ void ModemFMStereo::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInp
|
|||||||
phase_error = atan2f(u.imag,u.real);
|
phase_error = atan2f(u.imag,u.real);
|
||||||
|
|
||||||
// step pll
|
// step pll
|
||||||
nco_crcf_pll_step(stereoPilot, phase_error);
|
nco_crcf_pll_step(fmkit->stereoPilot, phase_error);
|
||||||
nco_crcf_step(stereoPilot);
|
nco_crcf_step(fmkit->stereoPilot);
|
||||||
|
|
||||||
// 38khz down-mix
|
// 38khz down-mix
|
||||||
nco_crcf_mix_down(stereoPilot, x, &y);
|
nco_crcf_mix_down(fmkit->stereoPilot, x, &y);
|
||||||
nco_crcf_mix_down(stereoPilot, y, &x);
|
nco_crcf_mix_down(fmkit->stereoPilot, y, &x);
|
||||||
|
|
||||||
// complex -> real
|
// complex -> real
|
||||||
firhilbf_c2r_execute(firStereoC2R, x, &demodStereoData[i]);
|
firhilbf_c2r_execute(fmkit->firStereoC2R, x, &demodStereoData[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// std::cout << "[PLL] phase error: " << phase_error;
|
// std::cout << "[PLL] phase error: " << phase_error;
|
||||||
|
@ -13,6 +13,11 @@ public:
|
|||||||
firfilt_rrrf firStereoLeft;
|
firfilt_rrrf firStereoLeft;
|
||||||
firfilt_rrrf firStereoRight;
|
firfilt_rrrf firStereoRight;
|
||||||
iirfilt_crcf iirStereoPilot;
|
iirfilt_crcf iirStereoPilot;
|
||||||
|
|
||||||
|
firhilbf firStereoR2C;
|
||||||
|
firhilbf firStereoC2R;
|
||||||
|
|
||||||
|
nco_crcf stereoPilot;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -40,9 +45,4 @@ private:
|
|||||||
std::vector<float> resampledOutputData;
|
std::vector<float> resampledOutputData;
|
||||||
std::vector<float> resampledStereoData;
|
std::vector<float> resampledStereoData;
|
||||||
freqdem demodFM;
|
freqdem demodFM;
|
||||||
|
|
||||||
firhilbf firStereoR2C;
|
|
||||||
firhilbf firStereoC2R;
|
|
||||||
|
|
||||||
nco_crcf stereoPilot;
|
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user