mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-13 03:41:47 -05:00
commit
4ee2eb532a
@ -1938,6 +1938,10 @@ void FT8::soft_decode(const FFTEngine::ffts_t &c79, float ll174[])
|
||||
//
|
||||
void FT8::soft_decode_mags(FT8Params& params, const std::vector<std::vector<float>>& mags_, int nbSymbolBits, float ll174[])
|
||||
{
|
||||
if ((nbSymbolBits > 16) || (nbSymbolBits < 1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<std::vector<float>> mags = convert_to_snr_gen(params, nbSymbolBits, mags_);
|
||||
// statistics to decide soft probabilities.
|
||||
// distribution of strongest tones, and
|
||||
@ -1949,8 +1953,8 @@ void FT8::soft_decode_mags(FT8Params& params, const std::vector<std::vector<floa
|
||||
int lli = 0;
|
||||
int zoX = 1<<(nbSymbolBits-1);
|
||||
int zoY = nbSymbolBits;
|
||||
int *zeroi = new int[zoX*zoY];
|
||||
int *onei = new int[zoX*zoY];
|
||||
std::vector<int> zeroi(zoX*zoY);
|
||||
std::vector<int> onei(zoX*zoY);
|
||||
|
||||
for (int biti = 0; biti < nbSymbolBits; biti++)
|
||||
{
|
||||
|
@ -370,9 +370,9 @@ void LDPC::ft8_crc(int msg1[], int msglen, int out[14])
|
||||
// the new FT8 polynomial for 14-bit CRC, 0x2757,
|
||||
// with leading 1 bit.
|
||||
int div[] = {1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1};
|
||||
|
||||
// append 14 zeros.
|
||||
int *msg = (int *)malloc(sizeof(int) * (msglen + 14));
|
||||
|
||||
for (int i = 0; i < msglen + 14; i++)
|
||||
{
|
||||
if (i < msglen)
|
||||
@ -396,7 +396,7 @@ void LDPC::ft8_crc(int msg1[], int msglen, int out[14])
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 14; i++)
|
||||
for (int i = 0; i < msglen + 14; i++)
|
||||
{
|
||||
out[i] = msg[msglen + i];
|
||||
}
|
||||
|
@ -90,8 +90,8 @@ private:
|
||||
// Top area of each buffer is not used by writer, as it's used by the reader
|
||||
// for copying the last few samples of the previous buffer, so it can
|
||||
// be processed contiguously
|
||||
const int m_buffers = 3;
|
||||
const int m_bufferSize = 200000;
|
||||
static const int m_buffers = 3;
|
||||
static const int m_bufferSize = 200000;
|
||||
Real *m_sampleBuffer[3]; //!< Each buffer is m_bufferSize samples
|
||||
QSemaphore m_bufferWrite[3]; //!< Semaphore to control write access to the buffers
|
||||
QSemaphore m_bufferRead[3]; //!< Semaphore to control read access from the buffers
|
||||
|
@ -30,9 +30,11 @@ namespace ldpctool {
|
||||
template <typename TYPE>
|
||||
class LDPCEncoder
|
||||
{
|
||||
LDPCInterface *ldpc;
|
||||
int N, K, R;
|
||||
bool initialized;
|
||||
LDPCInterface *ldpc = nullptr;
|
||||
int N = 2;
|
||||
int K = 1;
|
||||
int R = 1;
|
||||
bool initialized = false;
|
||||
|
||||
TYPE one()
|
||||
{
|
||||
@ -43,9 +45,10 @@ class LDPCEncoder
|
||||
return b < TYPE(0) ? -a : b > TYPE(0) ? a : TYPE(0);
|
||||
}
|
||||
public:
|
||||
LDPCEncoder() : initialized(false)
|
||||
LDPCEncoder()
|
||||
{
|
||||
}
|
||||
|
||||
void init(LDPCInterface *it)
|
||||
{
|
||||
if (initialized)
|
||||
|
@ -77,18 +77,29 @@ public:
|
||||
template <typename TYPE, typename ALG>
|
||||
class LDPCDecoder
|
||||
{
|
||||
TYPE *bnl, *pty, *inp, *out;
|
||||
uint16_t *pos;
|
||||
uint8_t *cnc;
|
||||
private:
|
||||
TYPE *bnl = nullptr;
|
||||
TYPE *pty = nullptr;
|
||||
TYPE *inp = nullptr;
|
||||
TYPE *out = nullptr;
|
||||
uint16_t *pos = nullptr;
|
||||
uint8_t *cnc = nullptr;
|
||||
ALG alg;
|
||||
int M, N, K, R, q, CNL, LT;
|
||||
bool initialized;
|
||||
int M = 0;
|
||||
int N = 0;
|
||||
int K = 0;
|
||||
int R = 0;
|
||||
int q = 0;
|
||||
int CNL = 0;
|
||||
int LT = 0;
|
||||
bool initialized = false;
|
||||
|
||||
void reset()
|
||||
{
|
||||
for (int i = 0; i < LT; ++i)
|
||||
bnl[i] = alg.zero();
|
||||
}
|
||||
|
||||
bool bad(TYPE *data, TYPE *parity, int blocks)
|
||||
{
|
||||
for (int i = 0; i < q; ++i) {
|
||||
@ -107,6 +118,7 @@ class LDPCDecoder
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void update(TYPE *data, TYPE *parity)
|
||||
{
|
||||
TYPE *bl = bnl;
|
||||
@ -135,10 +147,12 @@ class LDPCDecoder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
LDPCDecoder() : initialized(false)
|
||||
LDPCDecoder()
|
||||
{
|
||||
}
|
||||
|
||||
void init(LDPCInterface *it)
|
||||
{
|
||||
if (initialized) {
|
||||
|
@ -124,16 +124,18 @@ int main(int argc, char **argv)
|
||||
|
||||
// DVB-S2 MODCOD definitions
|
||||
static const char *mc_tabnames[2][32] = { // [shortframes][modcod]
|
||||
{// Normal frames
|
||||
0, "B1", "B2", "B3", "B4", "B5", "B6", "B7",
|
||||
"B8", "B9", "B10", "B11", "B5", "B6", "B7", "B9",
|
||||
"B10", "B11", "B6", "B7", "B8", "B9", "B10", "B11",
|
||||
"B7", "B8", "B8", "B10", "B11", 0, 0, 0},
|
||||
{// Short frames
|
||||
0, "C1", "C2", "C3", "C4", "C5", "C6", "C7",
|
||||
"C8", "C9", "C10", 0, "C5", "C6", "C7", "C9",
|
||||
"C10", 0, "C6", "C7", "C8", "C9", "C10", 0,
|
||||
"C7", "C8", "C8", "C10", 0, 0, 0, 0}};
|
||||
{// Normal frames
|
||||
nullptr, "B1", "B2", "B3", "B4", "B5", "B6", "B7",
|
||||
"B8", "B9", "B10", "B11", "B5", "B6", "B7", "B9",
|
||||
"B10", "B11", "B6", "B7", "B8", "B9", "B10", "B11",
|
||||
"B7", "B8", "B8", "B10", "B11", nullptr, nullptr, nullptr
|
||||
},
|
||||
{// Short frames
|
||||
nullptr, "C1", "C2", "C3", "C4", "C5", "C6", "C7",
|
||||
"C8", "C9", "C10", nullptr, "C5", "C6", "C7", "C9",
|
||||
"C10", nullptr, "C6", "C7", "C8", "C9", "C10", nullptr,
|
||||
"C7", "C8", "C8", "C10", nullptr, nullptr, nullptr, nullptr
|
||||
}};
|
||||
|
||||
const char *tabname = mc_tabnames[shortframes][modcod];
|
||||
if (!tabname)
|
||||
@ -188,8 +190,16 @@ int main(int argc, char **argv)
|
||||
int blocks = j + ldpctool::SIMD_WIDTH > BLOCKS ? BLOCKS - j : ldpctool::SIMD_WIDTH;
|
||||
|
||||
for (int n = 0; n < blocks; ++n)
|
||||
{
|
||||
for (int i = 0; i < CODE_LEN; ++i)
|
||||
{
|
||||
if (((j + n) * CODE_LEN + i) >= BLOCKS * CODE_LEN) {
|
||||
break;
|
||||
}
|
||||
|
||||
reinterpret_cast<ldpctool::code_type *>(simd + i)[n] = code[(j + n) * CODE_LEN + i];
|
||||
}
|
||||
}
|
||||
|
||||
int count = decode(simd, simd + DATA_LEN, max_trials, blocks);
|
||||
num_decodes++;
|
||||
|
@ -155,14 +155,12 @@ RadioAstronomy::~RadioAstronomy()
|
||||
m_deviceAPI->removeChannelSinkAPI(this);
|
||||
m_deviceAPI->removeChannelSink(this);
|
||||
|
||||
if (m_basebandSink->isRunning()) {
|
||||
if ((m_basebandSink->isRunning()) || (m_worker->isRunning())) {
|
||||
stop();
|
||||
}
|
||||
delete m_basebandSink;
|
||||
if (m_worker->isRunning()) {
|
||||
stop();
|
||||
}
|
||||
delete m_worker;
|
||||
|
||||
m_worker->deleteLater();
|
||||
m_basebandSink->deleteLater();
|
||||
}
|
||||
|
||||
void RadioAstronomy::setDeviceAPI(DeviceAPI *deviceAPI)
|
||||
|
@ -50,10 +50,10 @@ struct IEEE_802_15_4_MacFrame
|
||||
uint16_t m_frameControl;
|
||||
uint8_t m_sequenceNumber;
|
||||
uint16_t m_destPANID;
|
||||
uint16_t m_destShortAddress;
|
||||
uint16_t m_destShortAddress = 0;
|
||||
ieee_802_15_4_address m_destAddress;
|
||||
uint16_t m_sourcePANID;
|
||||
uint16_t m_sourceShortAddress;
|
||||
uint16_t m_sourceShortAddress = 0;
|
||||
ieee_802_15_4_address m_sourceAddress;
|
||||
uint8_t m_payload[IEEE_802_15_4_MAC_PAYLOAD_MAX_LENGTH];
|
||||
uint8_t m_payloadLength;
|
||||
|
@ -14,7 +14,7 @@ except ImportError:
|
||||
import _thread as thread
|
||||
import time
|
||||
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from optparse import OptionParser
|
||||
|
||||
import sdrangel
|
||||
@ -50,7 +50,7 @@ class SuperScannerAPIError(SuperScannerError):
|
||||
|
||||
# ======================================================================
|
||||
def log_with_timestamp(message):
|
||||
t = datetime.utcnow()
|
||||
t = datetime.now(timezone.utc)
|
||||
print(f'{t.isoformat()} {message}')
|
||||
|
||||
# ======================================================================
|
||||
|
@ -143,7 +143,7 @@ void SigMFFileRecord::setFileName(const QString& fileName)
|
||||
}
|
||||
m_initialBytesCount = (uint64_t) m_sampleFile.size();
|
||||
m_sampleStart = m_initialBytesCount / ((1<<m_log2RecordSampleSize)/4); // sizeof(Sample);
|
||||
|
||||
|
||||
if (!m_metaFile.open(QIODevice::WriteOnly | QIODevice::Append))
|
||||
{
|
||||
qWarning() << "SigMFFileRecord::setFileName: failed to open file: " << m_metaFile.fileName();
|
||||
@ -218,7 +218,7 @@ bool SigMFFileRecord::stopRecording()
|
||||
{
|
||||
if (m_recordOn)
|
||||
{
|
||||
qDebug("SigMFFileRecord::stopRecording: file previous capture");
|
||||
qDebug("SigMFFileRecord::stopRecording: file previous capture");
|
||||
makeCapture();
|
||||
m_recordOn = false;
|
||||
if (m_sampleFile.error())
|
||||
|
@ -370,7 +370,13 @@ void WFIR::WindowData(double *Data, int N, TWindowType WindowType, double Alpha,
|
||||
if (WindowType != wtKAISER && WindowType != wtFLATTOP)
|
||||
{
|
||||
for (j = M / 2; j < N - M / 2; j++)
|
||||
{
|
||||
if (j >= N + 2) {
|
||||
break;
|
||||
}
|
||||
|
||||
WinCoeff[j] = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
// This will set the gain of the window to 1. Only the Flattop window has unity gain by design.
|
||||
|
@ -117,7 +117,6 @@ void CFCOMP::calc_comp (CFCOMP *a)
|
||||
a->G[i] = sary[3 * i + 1];
|
||||
a->E[i] = sary[3 * i + 2];
|
||||
}
|
||||
delete[] (sary);
|
||||
a->fp[0] = 0.0;
|
||||
a->fp[a->nfreqs + 1] = fmax;
|
||||
a->gp[0] = a->G[0];
|
||||
|
@ -230,7 +230,7 @@ void EMNR::interpM (double* res, double x, int nvals, double* xvals, double* yva
|
||||
}
|
||||
else
|
||||
{
|
||||
int idx = 0;
|
||||
int idx = 1;
|
||||
double xllow, xlhigh, frac;
|
||||
|
||||
while ((x >= xvals[idx]) && (idx < nvals - 1))
|
||||
|
10
wdsp/fir.cpp
10
wdsp/fir.cpp
@ -317,10 +317,15 @@ float *FIR::fir_read (int N, const char *filename, int rtype, float scale)
|
||||
|
||||
void FIR::analytic (int N, float* in, float* out)
|
||||
{
|
||||
if (N < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
int i;
|
||||
double inv_N = 1.0 / (double) N;
|
||||
double two_inv_N = 2.0 * inv_N;
|
||||
float* x = new float[N * 2]; // (float *) malloc0 (N * sizeof (complex));
|
||||
|
||||
fftwf_plan pfor = fftwf_plan_dft_1d (
|
||||
N,
|
||||
(fftwf_complex *) in,
|
||||
@ -328,6 +333,7 @@ void FIR::analytic (int N, float* in, float* out)
|
||||
FFTW_FORWARD,
|
||||
FFTW_PATIENT
|
||||
);
|
||||
|
||||
fftwf_plan prev = fftwf_plan_dft_1d (
|
||||
N,
|
||||
(fftwf_complex *) x,
|
||||
@ -335,20 +341,24 @@ void FIR::analytic (int N, float* in, float* out)
|
||||
FFTW_BACKWARD,
|
||||
FFTW_PATIENT
|
||||
);
|
||||
|
||||
fftwf_execute (pfor);
|
||||
x[0] *= inv_N;
|
||||
x[1] *= inv_N;
|
||||
|
||||
for (i = 1; i < N / 2; i++)
|
||||
{
|
||||
x[2 * i + 0] *= two_inv_N;
|
||||
x[2 * i + 1] *= two_inv_N;
|
||||
}
|
||||
|
||||
x[N + 0] *= inv_N;
|
||||
x[N + 1] *= inv_N;
|
||||
memset (&x[N + 2], 0, (N - 2) * sizeof (float));
|
||||
fftwf_execute (prev);
|
||||
fftwf_destroy_plan (prev);
|
||||
fftwf_destroy_plan (pfor);
|
||||
|
||||
delete[] x;
|
||||
}
|
||||
|
||||
|
@ -60,8 +60,8 @@ void RESAMPLE::calc_resample (RESAMPLE *a)
|
||||
a->L = a->out_rate / x;
|
||||
a->M = a->in_rate / x;
|
||||
|
||||
a->L <= 0 ? 1 : a->L;
|
||||
a->M <= 0 ? 1 : a->M;
|
||||
a->L = a->L <= 0 ? 1 : a->L;
|
||||
a->M = a->M <= 0 ? 1 : a->M;
|
||||
|
||||
if (a->in_rate < a->out_rate)
|
||||
min_rate = a->in_rate;
|
||||
|
@ -64,8 +64,8 @@ RESAMPLEF* RESAMPLEF::create_resampleF ( int run, int size, float* in, float* ou
|
||||
a->L = out_rate / x;
|
||||
a->M = in_rate / x;
|
||||
|
||||
a->L <= 0 ? 1 : a->L;
|
||||
a->M <= 0 ? 1 : a->M;
|
||||
a->L = a->L <= 0 ? 1 : a->L;
|
||||
a->M = a->M <= 0 ? 1 : a->M;
|
||||
|
||||
if (in_rate < out_rate)
|
||||
min_rate = in_rate;
|
||||
|
Loading…
Reference in New Issue
Block a user