fix: incorrect snr fix attempt & normalize signal

pull/113/head
Guenael 2021-12-23 15:31:34 -05:00
rodzic 94129c54a1
commit 242d593156
2 zmienionych plików z 27 dodań i 4 usunięć

Wyświetl plik

@ -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
*/

Wyświetl plik

@ -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;
}