diff --git a/rtlsdr_wsprd.c b/rtlsdr_wsprd.c index 1bc60c7..5e88cc1 100644 --- a/rtlsdr_wsprd.c +++ b/rtlsdr_wsprd.c @@ -220,8 +220,8 @@ static void rtlsdr_callback(unsigned char *samples, uint32_t samples_count, void /* Save the result in the buffer */ uint32_t idx = rx_state.bufferIndex; if (rx_state.iqIndex[idx] < (SIGNAL_LENGHT * SIGNAL_SAMPLE_RATE)) { - rx_state.iSamples[idx][rx_state.iqIndex[idx]] = Isum / (32768.0 * DOWNSAMPLING); - rx_state.qSamples[idx][rx_state.iqIndex[idx]] = Qsum / (32768.0 * DOWNSAMPLING); + rx_state.iSamples[idx][rx_state.iqIndex[idx]] = Isum; + rx_state.qSamples[idx][rx_state.iqIndex[idx]] = Qsum; rx_state.iqIndex[idx]++; } } @@ -259,6 +259,29 @@ static void *decoder(void *arg) { if (rx_state.iqIndex[prevBuffer] < ( (SIGNAL_LENGHT - 3) * SIGNAL_SAMPLE_RATE ) ) continue; /* Partial buffer during the first RX, skip it! */ + /* Delete any previous samples tail */ + for (int i = rx_state.iqIndex[prevBuffer]; i < SIGNAL_LENGHT * SIGNAL_SAMPLE_RATE; i++) { + rx_state.iSamples[prevBuffer][i] = 0.0; + rx_state.qSamples[prevBuffer][i] = 0.0; + } + + /* Normalize the sample @-3dB */ + float maxSig = 0.0f; + for (int i = 0; i < SIGNAL_LENGHT * SIGNAL_SAMPLE_RATE; i++) { + float absI = fabs(rx_state.iSamples[prevBuffer][i]); + float absQ = fabs(rx_state.qSamples[prevBuffer][i]); + + if (absI > maxSig) + maxSig = absI; + if (absQ > maxSig) + maxSig = absQ; + } + maxSig = 0.5 / maxSig; + for (int i = 0; i < SIGNAL_LENGHT * SIGNAL_SAMPLE_RATE; i++) { + rx_state.iSamples[prevBuffer][i] *= maxSig; + rx_state.qSamples[prevBuffer][i] *= maxSig; + } + /* Get the date at the beginning last recording session with 1 second margin added, just to be sure to be on this even minute */ diff --git a/wsprd/wsprd.c b/wsprd/wsprd.c index 384513a..577bc8b 100644 --- a/wsprd/wsprd.c +++ b/wsprd/wsprd.c @@ -573,12 +573,12 @@ int wspr_decode(float *idat, * corresponding to -7-26.3=-33.3dB in 2500 Hz bandwidth. * The corresponding threshold is -42.3 dB in 2500 Hz bandwidth for WSPR-15. */ - float min_snr = powf(10.0, -7.0 / 10.0); // this is min snr in wspr bw + float min_snr = powf(10.0, -8.0 / 10.0); // this is min snr in wspr bw float snr_scaling_factor = 26.3; for (int j = 0; j < 411; j++) { smspec[j] = smspec[j] / noise_level - 1.0; - if (smspec[j] < min_snr) smspec[j] = 0.1; + if (smspec[j] < min_snr) smspec[j] = 0.1 * min_snr; continue; }