kopia lustrzana https://github.com/Guenael/rtlsdr-wsprd
fix: incorrect snr fix attempt & normalize signal
rodzic
94129c54a1
commit
242d593156
|
@ -220,8 +220,8 @@ static void rtlsdr_callback(unsigned char *samples, uint32_t samples_count, void
|
||||||
/* Save the result in the buffer */
|
/* Save the result in the buffer */
|
||||||
uint32_t idx = rx_state.bufferIndex;
|
uint32_t idx = rx_state.bufferIndex;
|
||||||
if (rx_state.iqIndex[idx] < (SIGNAL_LENGHT * SIGNAL_SAMPLE_RATE)) {
|
if (rx_state.iqIndex[idx] < (SIGNAL_LENGHT * SIGNAL_SAMPLE_RATE)) {
|
||||||
rx_state.iSamples[idx][rx_state.iqIndex[idx]] = Isum / (32768.0 * DOWNSAMPLING);
|
rx_state.iSamples[idx][rx_state.iqIndex[idx]] = Isum;
|
||||||
rx_state.qSamples[idx][rx_state.iqIndex[idx]] = Qsum / (32768.0 * DOWNSAMPLING);
|
rx_state.qSamples[idx][rx_state.iqIndex[idx]] = Qsum;
|
||||||
rx_state.iqIndex[idx]++;
|
rx_state.iqIndex[idx]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,6 +259,29 @@ static void *decoder(void *arg) {
|
||||||
if (rx_state.iqIndex[prevBuffer] < ( (SIGNAL_LENGHT - 3) * SIGNAL_SAMPLE_RATE ) )
|
if (rx_state.iqIndex[prevBuffer] < ( (SIGNAL_LENGHT - 3) * SIGNAL_SAMPLE_RATE ) )
|
||||||
continue; /* Partial buffer during the first RX, skip it! */
|
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
|
/* Get the date at the beginning last recording session
|
||||||
with 1 second margin added, just to be sure to be on this even minute
|
with 1 second margin added, just to be sure to be on this even minute
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -573,12 +573,12 @@ int wspr_decode(float *idat,
|
||||||
* corresponding to -7-26.3=-33.3dB in 2500 Hz bandwidth.
|
* 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. */
|
* 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;
|
float snr_scaling_factor = 26.3;
|
||||||
|
|
||||||
for (int j = 0; j < 411; j++) {
|
for (int j = 0; j < 411; j++) {
|
||||||
smspec[j] = smspec[j] / noise_level - 1.0;
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue