Merged master 8748
This commit is contained in:
Binary file not shown.
@@ -1,59 +0,0 @@
|
||||
#ifndef DETECTOR_HPP__
|
||||
#define DETECTOR_HPP__
|
||||
#include "AudioDevice.hpp"
|
||||
#include <QScopedArrayPointer>
|
||||
|
||||
//
|
||||
// output device that distributes data in predefined chunks via a signal
|
||||
//
|
||||
// the underlying device for this abstraction is just the buffer that
|
||||
// stores samples throughout a receiving period
|
||||
//
|
||||
class Detector : public AudioDevice
|
||||
{
|
||||
Q_OBJECT;
|
||||
|
||||
public:
|
||||
//
|
||||
// if the data buffer were not global storage and fixed size then we
|
||||
// might want maximum size passed as constructor arguments
|
||||
//
|
||||
// we down sample by a factor of 4
|
||||
//
|
||||
// the samplesPerFFT argument is the number after down sampling
|
||||
//
|
||||
Detector (unsigned frameRate, unsigned periodLengthInSeconds, unsigned downSampleFactor = 4u, QObject * parent = 0);
|
||||
|
||||
void setPeriod(unsigned p) {m_period=p;}
|
||||
bool reset () override;
|
||||
|
||||
Q_SIGNAL void framesWritten (qint64) const;
|
||||
Q_SLOT void setBlockSize (unsigned);
|
||||
|
||||
protected:
|
||||
qint64 readData (char * /* data */, qint64 /* maxSize */) override
|
||||
{
|
||||
return -1; // we don't produce data
|
||||
}
|
||||
|
||||
qint64 writeData (char const * data, qint64 maxSize) override;
|
||||
|
||||
private:
|
||||
void clear (); // discard buffer contents
|
||||
unsigned secondInPeriod () const;
|
||||
|
||||
unsigned m_frameRate;
|
||||
unsigned m_period;
|
||||
unsigned m_downSampleFactor;
|
||||
qint32 m_samplesPerFFT; // after any down sampling
|
||||
qint32 m_ns;
|
||||
static size_t const max_buffer_size {7 * 512};
|
||||
QScopedArrayPointer<short> m_buffer; // de-interleaved sample buffer
|
||||
// big enough for all the
|
||||
// samples for one increment of
|
||||
// data (a signals worth) at
|
||||
// the input sample rate
|
||||
unsigned m_bufferPos;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,573 +0,0 @@
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include "BigGirth.h"
|
||||
#include "Random.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
NodesInGraph::NodesInGraph(void) {
|
||||
connectionParityBit=NULL;
|
||||
connectionSymbolBit=NULL;
|
||||
}
|
||||
|
||||
void NodesInGraph::setNumOfConnectionSymbolBit(int deg) {
|
||||
if(deg<=0) {cout<<"Wrong NodesInGraph::setNumOfConnectionSymbolBit()"<<endl;exit(-1);}
|
||||
numOfConnectionSymbolBit=deg;
|
||||
connectionSymbolBit=new int[deg];
|
||||
}
|
||||
void NodesInGraph::initConnectionParityBit(void) {
|
||||
maxDegParity=10000;
|
||||
numOfConnectionParityBit=0;
|
||||
connectionParityBit=new int[1];//dummy memory, actually not used
|
||||
}
|
||||
void NodesInGraph::initConnectionParityBit(int deg) {
|
||||
maxDegParity=deg;
|
||||
numOfConnectionParityBit=0;
|
||||
connectionParityBit=new int[1];//dummy memory, actually not used
|
||||
}
|
||||
NodesInGraph::~NodesInGraph(void) {
|
||||
delete [] connectionParityBit;
|
||||
delete [] connectionSymbolBit;
|
||||
}
|
||||
|
||||
BigGirth::BigGirth(void) : H(NULL), verbose(true) { }
|
||||
|
||||
BigGirth::BigGirth(int M, int N, int *symbolDegSequence, const char *filename, int sglConcent, int tgtGirth, bool verbose_) : H(NULL), verbose(verbose_) {
|
||||
int i, j, k, m, index, localDepth=100;
|
||||
int *mid;
|
||||
|
||||
EXPAND_DEPTH=(tgtGirth-4)/2;
|
||||
if(EXPAND_DEPTH<0) EXPAND_DEPTH=0;
|
||||
|
||||
// corresponds to depth l in the PEG paper;
|
||||
// the target girth = 2*EXPAND_DEPTH+4
|
||||
// if set large, then GREEDY algorithm
|
||||
|
||||
myrandom=new Random(); //(12345678l, 987654321lu);
|
||||
|
||||
this->M=M;
|
||||
this->N=N;
|
||||
this->filename=filename;
|
||||
|
||||
mid=new int[M];
|
||||
|
||||
localGirth=new int[N];
|
||||
|
||||
nodesInGraph=new NodesInGraph [N];
|
||||
for(i=0;i<N;i++)
|
||||
nodesInGraph[i].setNumOfConnectionSymbolBit(symbolDegSequence[i]);
|
||||
|
||||
j=0;
|
||||
for(k=0;k<N;k++) j+=symbolDegSequence[k];
|
||||
k=j/M;
|
||||
for(i=0;i<M;i++) mid[i]=k;
|
||||
for(i=0;i<j-k*M;i++) mid[i]++;
|
||||
k=0; for(i=0;i<M;i++) k+=mid[i];
|
||||
if(k!=j) {cout<<"Wrong in computing maxDegParity!"<<endl;exit(-1);}
|
||||
|
||||
for(i=0;i<M;i++) {
|
||||
if(sglConcent==0) nodesInGraph[i].initConnectionParityBit(mid[i]);
|
||||
else nodesInGraph[i].initConnectionParityBit();
|
||||
}
|
||||
|
||||
for(k=0;k<N;k++){
|
||||
m=1000000;index=-1;
|
||||
for(i=0;i<M;i++){
|
||||
if(nodesInGraph[i].numOfConnectionParityBit<m && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity) {
|
||||
m=nodesInGraph[i].numOfConnectionParityBit;
|
||||
index=i;
|
||||
}
|
||||
}
|
||||
nodesInGraph[k].connectionSymbolBit[0]=index;//least connections of parity bit
|
||||
|
||||
int iter=0;
|
||||
ITER:
|
||||
localGirth[k]=100;
|
||||
for(m=1;m<nodesInGraph[k].numOfConnectionSymbolBit;m++){
|
||||
nodesInGraph[k].connectionSymbolBit[m]=selectParityConnect(k, m, localDepth);
|
||||
localGirth[k]=(localGirth[k]>localDepth)?localDepth:localGirth[k];
|
||||
if(k>0 && localGirth[k]<localGirth[k-1] && iter<20) {iter++; goto ITER;}
|
||||
if(localGirth[k]==0 && iter<30) {iter++; goto ITER;}
|
||||
}
|
||||
//if((k+1)%100==0) {
|
||||
if(verbose) {
|
||||
cout<<"k="<<k<<" ";
|
||||
for(m=0;m<nodesInGraph[k].numOfConnectionSymbolBit;m++)
|
||||
cout<<nodesInGraph[k].connectionSymbolBit[m]<<" ";
|
||||
cout<<"LocalGirth="<<2*localGirth[k]+4;
|
||||
cout<<endl;
|
||||
}
|
||||
updateConnection(k);
|
||||
}
|
||||
|
||||
if(verbose) {
|
||||
cout<<"Showing the row weight distribution..."<<endl;
|
||||
for(i=0;i<M;i++)
|
||||
cout<<nodesInGraph[i].numOfConnectionParityBit<<" ";
|
||||
cout<<endl;
|
||||
}
|
||||
delete [] mid;
|
||||
|
||||
ofstream cycleFile;
|
||||
cycleFile.open("leftHandGirth.log", ios::out);
|
||||
localDepth=100;
|
||||
for(k=0;k<N;k++) {
|
||||
if(localGirth[k]<localDepth) localDepth=localGirth[k];
|
||||
if(localDepth==100) cycleFile<<"inf ";
|
||||
else cycleFile<<2*localDepth+4<<" ";
|
||||
}
|
||||
cycleFile<<endl;
|
||||
cycleFile.close();
|
||||
|
||||
if(verbose) {
|
||||
cout<<"*************************************************************"<<endl;
|
||||
cout<<" The global girth of the PEG Tanner graph :="<< 2*localDepth+4<<endl;
|
||||
cout<<"*************************************************************"<<endl;
|
||||
}
|
||||
|
||||
loadH();
|
||||
|
||||
}
|
||||
|
||||
BigGirth::~BigGirth(void) {
|
||||
if(H!=NULL) {
|
||||
for(int i=0;i<M;i++)
|
||||
delete [] H[i];
|
||||
delete [] H;
|
||||
H=NULL;
|
||||
}
|
||||
delete [] localGirth;
|
||||
delete [] nodesInGraph;
|
||||
nodesInGraph=NULL;
|
||||
delete myrandom;
|
||||
}
|
||||
|
||||
int BigGirth::selectParityConnect(int kthSymbol, int mthConnection, int & cycle) {
|
||||
int i, j, k, index, mincycles, numCur, cpNumCur;
|
||||
int *tmp, *med;
|
||||
int *current;//take note of the covering parity bits
|
||||
|
||||
mincycles=0;
|
||||
tmp=new int[M]; med=new int[M];
|
||||
|
||||
numCur=mthConnection;
|
||||
current=new int[mthConnection];
|
||||
for(i=0;i<mthConnection;i++) current[i]=nodesInGraph[kthSymbol].connectionSymbolBit[i];
|
||||
|
||||
LOOP:
|
||||
mincycles++;
|
||||
for(i=0;i<M;i++) tmp[i]=0;
|
||||
//maintain
|
||||
for(i=0;i<mthConnection;i++) tmp[nodesInGraph[kthSymbol].connectionSymbolBit[i]]=1;
|
||||
for(i=0;i<numCur;i++){
|
||||
for(j=0;j<nodesInGraph[current[i]].numOfConnectionParityBit;j++){
|
||||
for(k=0;k<nodesInGraph[nodesInGraph[current[i]].connectionParityBit[j]].numOfConnectionSymbolBit;k++){
|
||||
tmp[nodesInGraph[nodesInGraph[current[i]].connectionParityBit[j]].connectionSymbolBit[k]]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
index=0; cpNumCur=0;
|
||||
for(i=0;i<M;i++) {
|
||||
if(tmp[i]==1) cpNumCur++;
|
||||
if(tmp[i]==1 || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity)
|
||||
index++;
|
||||
}
|
||||
if(cpNumCur==numCur) {//can not expand any more
|
||||
//additional handlement to select one having least connections
|
||||
j=10000000; //dummy number
|
||||
for(i=0;i<M;i++){
|
||||
if(tmp[i]==0 && nodesInGraph[i].numOfConnectionParityBit<j && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity)
|
||||
j=nodesInGraph[i].numOfConnectionParityBit;
|
||||
}
|
||||
for(i=0;i<M;i++){
|
||||
if(tmp[i]==0){
|
||||
if(nodesInGraph[i].numOfConnectionParityBit!=j || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity){
|
||||
tmp[i]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
index=0;
|
||||
for(i=0;i<M;i++) if(tmp[i]==1) index++;
|
||||
//----------------------------------------------------------------
|
||||
j=(*myrandom).uniform(0, M-index)+1; //randomly selected
|
||||
index=0;
|
||||
for(i=0;i<M;i++){
|
||||
if(tmp[i]==0) index++;
|
||||
if(index==j) break;
|
||||
}
|
||||
delete [] tmp; tmp=NULL;
|
||||
delete [] current; current=NULL;
|
||||
return(i);
|
||||
}
|
||||
else if(index==M || mincycles>EXPAND_DEPTH){//covering all parity nodes or meet the upper bound on cycles
|
||||
|
||||
cycle=mincycles-1;
|
||||
for(i=0;i<M;i++) tmp[i]=0;
|
||||
for(i=0;i<numCur;i++) tmp[current[i]]=1;
|
||||
index=0;
|
||||
for(i=0;i<M;i++) if(tmp[i]==1) index++;
|
||||
if(index!=numCur) {cout<<"Error in the case of (index==M)"<<endl;exit(-1);}
|
||||
//additional handlement to select one having least connections
|
||||
j=10000000;
|
||||
for(i=0;i<M;i++){
|
||||
if(tmp[i]==0 && nodesInGraph[i].numOfConnectionParityBit<j && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity)
|
||||
j=nodesInGraph[i].numOfConnectionParityBit;
|
||||
}
|
||||
for(i=0;i<M;i++){
|
||||
if(tmp[i]==0){
|
||||
if(nodesInGraph[i].numOfConnectionParityBit!=j || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity){
|
||||
tmp[i]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
index=0;
|
||||
for(i=0;i<M;i++) if(tmp[i]==1) index++;
|
||||
|
||||
j=(*myrandom).uniform(0, M-index)+1;
|
||||
index=0;
|
||||
for(i=0;i<M;i++){
|
||||
if(tmp[i]==0) index++;
|
||||
if(index==j) break;
|
||||
}
|
||||
delete [] tmp; tmp=NULL;
|
||||
delete [] current; current=NULL;
|
||||
return(i);
|
||||
}
|
||||
else if(cpNumCur>numCur && index!=M){
|
||||
delete [] current;
|
||||
current=NULL;
|
||||
numCur=cpNumCur;
|
||||
current=new int[numCur];
|
||||
index=0;
|
||||
for(i=0;i<M;i++) {
|
||||
if(tmp[i]==1) {current[index]=i; index++;}
|
||||
}
|
||||
goto LOOP;
|
||||
}
|
||||
else {
|
||||
cout<<"Should not come to this point..."<<endl;
|
||||
cout<<"Error in BigGirth::selectParityConnect()"<<endl;
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void BigGirth::updateConnection(int kthSymbol){
|
||||
int i, j, m;
|
||||
int *tmp;
|
||||
|
||||
for(i=0;i<nodesInGraph[kthSymbol].numOfConnectionSymbolBit;i++){
|
||||
m=nodesInGraph[kthSymbol].connectionSymbolBit[i];//m [0, M) parity node
|
||||
tmp=new int[nodesInGraph[m].numOfConnectionParityBit+1];
|
||||
for(j=0;j<nodesInGraph[m].numOfConnectionParityBit;j++)
|
||||
tmp[j]=nodesInGraph[m].connectionParityBit[j];
|
||||
tmp[nodesInGraph[m].numOfConnectionParityBit]=kthSymbol;
|
||||
|
||||
delete [] nodesInGraph[m].connectionParityBit;
|
||||
nodesInGraph[m].connectionParityBit=NULL;
|
||||
nodesInGraph[m].numOfConnectionParityBit++; //increase by 1
|
||||
nodesInGraph[m].connectionParityBit=new int[nodesInGraph[m].numOfConnectionParityBit];
|
||||
for(j=0;j<nodesInGraph[m].numOfConnectionParityBit;j++)
|
||||
nodesInGraph[m].connectionParityBit[j]=tmp[j];
|
||||
delete [] tmp;
|
||||
tmp=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void BigGirth::loadH(void){
|
||||
int i, j;
|
||||
if(H==NULL) {
|
||||
H=new int*[M];
|
||||
for(i=0;i<M;i++) H[i]=new int[N];
|
||||
}
|
||||
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<N;j++){
|
||||
H[i][j]=0;
|
||||
}
|
||||
}
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<nodesInGraph[i].numOfConnectionParityBit;j++){
|
||||
H[i][nodesInGraph[i].connectionParityBit[j]]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BigGirth::writeToFile_Hmatrix(void){
|
||||
int i, j;
|
||||
|
||||
loadH();
|
||||
|
||||
//cout<<"---------------code format--------------------------"<<endl;
|
||||
//cout<<"- Block length N -"<<endl;
|
||||
//cout<<"- Num of Check Nodex M -"<<endl;
|
||||
//cout<<"- H matrix -"<<endl;
|
||||
//cout<<"----------------------------------------------------"<<endl;
|
||||
|
||||
ofstream codefile;
|
||||
codefile.open(filename,ios::out);
|
||||
codefile<<N<<" "<<M<<endl;
|
||||
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<N;j++){
|
||||
codefile<<H[i][j]<<" ";
|
||||
}
|
||||
codefile<<endl;
|
||||
}
|
||||
codefile.close();
|
||||
}
|
||||
|
||||
void BigGirth::writeToFile_Hcompressed(void){
|
||||
int i, j, max_col;
|
||||
int *(*parityCheck_compressed);
|
||||
|
||||
//cout<<"---------------code format--------------------------"<<endl;
|
||||
//cout<<"- Block length N -"<<endl;
|
||||
//cout<<"- Num of Check Nodex M -"<<endl;
|
||||
//cout<<"- Num of column in the compressed H -"<<endl;
|
||||
//cout<<"- H matrix (compressed) -"<<endl;
|
||||
//cout<<"----------------------------------------------------"<<endl;
|
||||
|
||||
//finding the num of columns, l, of the compressed parity-check matrix
|
||||
|
||||
max_col=0;
|
||||
for(i=0;i<M;i++)
|
||||
if(nodesInGraph[i].numOfConnectionParityBit>max_col)
|
||||
max_col=nodesInGraph[i].numOfConnectionParityBit;
|
||||
|
||||
parityCheck_compressed=new int * [M];
|
||||
for(i=0;i<M;i++)
|
||||
parityCheck_compressed[i]=new int[max_col];
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<max_col;j++) parityCheck_compressed[i][j]=0;
|
||||
for(j=0;j<nodesInGraph[i].numOfConnectionParityBit;j++){
|
||||
parityCheck_compressed[i][j]=nodesInGraph[i].connectionParityBit[j]+1;
|
||||
}
|
||||
}
|
||||
|
||||
ofstream codefile;
|
||||
codefile.open(filename,ios::out);
|
||||
codefile<<N<<endl;
|
||||
codefile<<M<<endl;
|
||||
codefile<<max_col<<endl;
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<max_col;j++)
|
||||
codefile<<parityCheck_compressed[i][j]<<" ";
|
||||
codefile<<endl;
|
||||
}
|
||||
codefile.close();
|
||||
|
||||
for(i=0;i<M;i++){
|
||||
delete [] parityCheck_compressed[i];
|
||||
parityCheck_compressed[i]=NULL;
|
||||
}
|
||||
delete [] parityCheck_compressed;
|
||||
parityCheck_compressed=NULL;
|
||||
}
|
||||
|
||||
void BigGirth::writeToFile(void){
|
||||
int i, j, k, d, redun;
|
||||
int imed, max_row, index, max_col;
|
||||
int *Index, *J, *itmp, *(*generator), *(*generator_compressed), *(*parityCheck_compressed);
|
||||
//Gaussian Ellimination
|
||||
Index=new int[M];
|
||||
J=new int[N];
|
||||
itmp=new int[N];
|
||||
for(i=0;i<M;i++) Index[i]=0; //indicator of redudant rows
|
||||
for(j=0;j<N;j++) J[j]=j; //column permutation
|
||||
redun=0;//the number of redundant rows
|
||||
|
||||
loadH();
|
||||
|
||||
for(k=0;k<M;k++){
|
||||
if(H[k][J[k-redun]]==0) {
|
||||
d=k;
|
||||
for(i=k+1-redun;i<N;i++)
|
||||
if(H[k][J[i]]!=0) {d=i;break;}
|
||||
if(d==k) {//full-zero row:delete this row
|
||||
redun++;
|
||||
Index[k]=1;
|
||||
continue;
|
||||
}
|
||||
else {//SWAP d column and k column in H matrix
|
||||
imed=J[k-redun];
|
||||
J[k-redun]=J[d];
|
||||
J[d]=imed;
|
||||
}
|
||||
}
|
||||
if(H[k][J[k-redun]]==0) {
|
||||
cout<<"ERROR: should not come to this point"<<endl;
|
||||
exit(-1);
|
||||
}
|
||||
else {
|
||||
for(i=k+1;i<M;i++){
|
||||
if(H[i][J[k-redun]]!=0){
|
||||
for(j=k-redun;j<N;j++)
|
||||
H[i][J[j]]=(H[i][J[j]]+H[k][J[j]])%2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(verbose)
|
||||
cout<<"Row rank of parity check matrix="<<M-redun<<endl;
|
||||
|
||||
K=N-M+redun;//num of the information bits
|
||||
|
||||
index=0;
|
||||
for(i=0;i<M;i++){
|
||||
if(Index[i]==0){ // all-zero row
|
||||
for(j=0;j<N;j++)
|
||||
itmp[j]=H[i][J[j]];
|
||||
for(j=0;j<N;j++)
|
||||
H[index][j]=itmp[j]; //Note: itmp can not be omitted here!!!
|
||||
index++;
|
||||
}
|
||||
}
|
||||
if(index!=M-redun) {cout<<"ERROR...if(index!=M-redun)"<<endl;exit(-1);}
|
||||
|
||||
for(k=index-1;k>0;k--){
|
||||
for(i=k-1;i>=0;i--){
|
||||
if(H[i][k]==1)
|
||||
for(j=k;j<N;j++)
|
||||
H[i][j]=(H[i][j]+H[k][j])%2;
|
||||
}
|
||||
}
|
||||
|
||||
if(verbose) {
|
||||
cout<<"****************************************************"<<endl;
|
||||
cout<<" Computing the compressed generator"<<endl;
|
||||
cout<<"****************************************************"<<endl;
|
||||
}
|
||||
generator=new int * [K];
|
||||
for(i=0;i<K;i++)
|
||||
generator[i]=new int[N-K];
|
||||
for(i=0;i<K;i++){
|
||||
for(j=0;j<N-K;j++)
|
||||
generator[i][j]=H[j][i+N-K];
|
||||
//for(j=N-K;j<N;j++)
|
||||
//generator[i][j]=0;
|
||||
//generator[i][i+N-K]=1;
|
||||
}
|
||||
max_row=0;
|
||||
for(j=0;j<N-K;j++){
|
||||
imed=0;
|
||||
for(i=0;i<K;i++)
|
||||
imed+=generator[i][j];
|
||||
if(imed>max_row) max_row=imed;
|
||||
}
|
||||
generator_compressed=new int * [max_row];
|
||||
for(i=0;i<max_row;i++)
|
||||
generator_compressed[i]=new int[N];
|
||||
for(j=0;j<N-K;j++){
|
||||
index=0;
|
||||
for(i=0;i<max_row;i++) generator_compressed[i][j]=0;
|
||||
for(i=0;i<K;i++){
|
||||
if(generator[i][j]==1) {
|
||||
generator_compressed[index][j]=i+1;
|
||||
if(index>=max_row-1) break;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(j=0;j<K;j++){
|
||||
for(i=0;i<max_row;i++) generator_compressed[i][j+N-K]=0;
|
||||
generator_compressed[0][j+N-K]=j+1;
|
||||
}
|
||||
if(verbose) {
|
||||
cout<<"*****************************************************"<<endl;
|
||||
cout<<" Computing the compressed parity-check matrix"<<endl;
|
||||
cout<<"*****************************************************"<<endl;
|
||||
}
|
||||
//finding the num of columns, l, of the compressed parity-check matrix
|
||||
loadH(); //loading parity check matrix again
|
||||
max_col=0;
|
||||
for(i=0;i<M;i++){
|
||||
imed=0;
|
||||
for(j=0;j<N;j++)
|
||||
imed+=H[i][j];
|
||||
if(imed>max_col) max_col=imed;
|
||||
}
|
||||
parityCheck_compressed=new int * [M];
|
||||
for(i=0;i<M;i++)
|
||||
parityCheck_compressed[i]=new int[max_col];
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<max_col;j++) parityCheck_compressed[i][j]=0;
|
||||
index=0;
|
||||
for(j=0;j<N;j++){
|
||||
if(H[i][J[j]]==1) {
|
||||
parityCheck_compressed[i][index]=j+1;
|
||||
if(index>=max_col-1) break;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(verbose) {
|
||||
cout<<"****************************************************"<<endl;
|
||||
cout<<" Write to file (TEXT!) "<<endl;
|
||||
cout<<"****************************************************"<<endl;
|
||||
}
|
||||
ofstream codefile;
|
||||
codefile.open(filename,ios::out);
|
||||
codefile<<N<<endl;
|
||||
codefile<<K<<endl;
|
||||
codefile<<M<<endl;
|
||||
codefile<<max_row<<endl;
|
||||
codefile<<max_col<<endl;
|
||||
for(i=0;i<max_row;i++){
|
||||
for(j=0;j<N;j++)
|
||||
codefile<<generator_compressed[i][j]<<" ";
|
||||
codefile<<endl;
|
||||
}
|
||||
for(i=0;i<M;i++){
|
||||
for(j=0;j<max_col;j++)
|
||||
codefile<<parityCheck_compressed[i][j]<<" ";
|
||||
codefile<<endl;
|
||||
}
|
||||
for(i=N-K;i<N;i++)
|
||||
codefile<<i+1<<" ";
|
||||
codefile<<endl;
|
||||
|
||||
codefile.close();
|
||||
if(verbose) {
|
||||
cout<<"****************************************************"<<endl;
|
||||
cout<<" Free memory"<<endl;
|
||||
cout<<"****************************************************"<<endl;
|
||||
}
|
||||
delete [] Index;
|
||||
Index=NULL;
|
||||
delete [] J;
|
||||
J=NULL;
|
||||
delete [] itmp;
|
||||
itmp=NULL;
|
||||
for(i=0;i<M;i++){
|
||||
delete [] parityCheck_compressed[i];
|
||||
parityCheck_compressed[i]=NULL;
|
||||
}
|
||||
delete [] parityCheck_compressed;
|
||||
parityCheck_compressed=NULL;
|
||||
for(i=0;i<max_row;i++){
|
||||
delete [] generator_compressed[i];
|
||||
generator_compressed[i]=NULL;
|
||||
}
|
||||
delete [] generator_compressed;
|
||||
generator_compressed=NULL;
|
||||
for(i=0;i<K;i++){
|
||||
delete [] generator[i];
|
||||
generator[i]=NULL;
|
||||
}
|
||||
delete [] generator;
|
||||
generator=NULL;
|
||||
|
||||
if(verbose) {
|
||||
cout<<"****************************************************"<<endl;
|
||||
cout<<" OK!"<<endl;
|
||||
cout<<"****************************************************"<<endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+96
-19
@@ -33,7 +33,6 @@
|
||||
#include "DisplayManual.hpp"
|
||||
#include "psk_reporter.h"
|
||||
#include "logbook/logbook.h"
|
||||
#include "decodedtext.h"
|
||||
#include "commons.h"
|
||||
#include "astro.h"
|
||||
#include "MessageBox.hpp"
|
||||
@@ -50,7 +49,7 @@
|
||||
#define NUM_FT8_SYMBOLS 79
|
||||
#define NUM_CW_SYMBOLS 250
|
||||
#define TX_SAMPLE_RATE 48000
|
||||
#define N_WIDGETS 24
|
||||
#define N_WIDGETS 33
|
||||
|
||||
extern int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols
|
||||
extern int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID
|
||||
@@ -82,6 +81,7 @@ class Detector;
|
||||
class SampleDownloader;
|
||||
class MultiSettings;
|
||||
class EqualizationToolsDialog;
|
||||
class DecodedText;
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
@@ -107,8 +107,9 @@ public slots:
|
||||
void diskDat();
|
||||
void freezeDecode(int n);
|
||||
void guiUpdate();
|
||||
void doubleClickOnCall(bool shift, bool ctrl);
|
||||
void doubleClickOnCall2(bool shift, bool ctrl);
|
||||
void doubleClickOnCall (Qt::KeyboardModifiers);
|
||||
void doubleClickOnCall2(Qt::KeyboardModifiers);
|
||||
void doubleClickOnFoxQueue(Qt::KeyboardModifiers);
|
||||
void readFromStdout();
|
||||
void p1ReadFromStdout();
|
||||
void setXIT(int n, Frequency base = 0u);
|
||||
@@ -123,6 +124,7 @@ protected:
|
||||
bool eventFilter(QObject *, QEvent *) override;
|
||||
|
||||
private slots:
|
||||
void initialize_fonts ();
|
||||
void on_tx1_editingFinished();
|
||||
void on_tx2_editingFinished();
|
||||
void on_tx3_editingFinished();
|
||||
@@ -136,6 +138,7 @@ private slots:
|
||||
void on_stopTxButton_clicked();
|
||||
void on_stopButton_clicked();
|
||||
void on_actionRelease_Notes_triggered ();
|
||||
void on_actionFT8_DXpedition_Mode_User_Guide_triggered();
|
||||
void on_actionOnline_User_Guide_triggered();
|
||||
void on_actionLocal_User_Guide_triggered();
|
||||
void on_actionWide_Waterfall_triggered();
|
||||
@@ -148,10 +151,14 @@ private slots:
|
||||
void on_actionSave_all_triggered();
|
||||
void on_actionKeyboard_shortcuts_triggered();
|
||||
void on_actionSpecial_mouse_commands_triggered();
|
||||
void on_actionSolve_FreqCal_triggered();
|
||||
void on_actionCopyright_Notice_triggered();
|
||||
void on_DecodeButton_clicked (bool);
|
||||
void decode();
|
||||
void decodeBusy(bool b);
|
||||
void on_EraseButton_clicked();
|
||||
void band_activity_cleared ();
|
||||
void rx_frequency_activity_cleared ();
|
||||
void on_txFirstCheckBox_stateChanged(int arg1);
|
||||
void set_dateTimeQSO(int m_ntx);
|
||||
void set_ntx(int n);
|
||||
@@ -192,6 +199,7 @@ private slots:
|
||||
void on_actionDeepestDecode_toggled (bool);
|
||||
void bumpFqso(int n);
|
||||
void on_actionErase_ALL_TXT_triggered();
|
||||
void on_actionErase_FoxQSO_txt_triggered();
|
||||
void on_actionErase_wsjtx_log_adi_triggered();
|
||||
void startTx2();
|
||||
void startP1();
|
||||
@@ -211,17 +219,17 @@ private slots:
|
||||
void on_tuneButton_clicked (bool);
|
||||
void on_pbR2T_clicked();
|
||||
void on_pbT2R_clicked();
|
||||
void acceptQSO2(QDateTime const&, QString const& call, QString const& grid
|
||||
void acceptQSO (QDateTime const&, QString const& call, QString const& grid
|
||||
, Frequency dial_freq, QString const& mode
|
||||
, QString const& rpt_sent, QString const& rpt_received
|
||||
, QString const& tx_power, QString const& comments
|
||||
, QString const& name, QDateTime const&);
|
||||
, QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
|
||||
, QString const& my_call, QString const& my_grid, QByteArray const& ADIF);
|
||||
void on_bandComboBox_currentIndexChanged (int index);
|
||||
void on_bandComboBox_activated (int index);
|
||||
void on_readFreq_clicked();
|
||||
void on_pbTxMode_clicked();
|
||||
void on_RxFreqSpinBox_valueChanged(int n);
|
||||
void on_cbTxLock_clicked(bool checked);
|
||||
void on_outAttenuation_valueChanged (int);
|
||||
void rigOpen ();
|
||||
void handle_transceiver_update (Transceiver::TransceiverState const&);
|
||||
@@ -234,6 +242,7 @@ private slots:
|
||||
void stopTuneATU();
|
||||
void auto_tx_mode(bool);
|
||||
void on_actionMessage_averaging_triggered();
|
||||
void on_actionFox_Log_triggered();
|
||||
void on_actionInclude_averaging_toggled (bool);
|
||||
void on_actionInclude_correlation_toggled (bool);
|
||||
void on_actionEnable_AP_DXcall_toggled (bool);
|
||||
@@ -243,8 +252,8 @@ private slots:
|
||||
void on_cbSWL_toggled(bool b);
|
||||
void on_cbTx6_toggled(bool b);
|
||||
void on_cbMenus_toggled(bool b);
|
||||
void on_cbCQonly_toggled(bool b);
|
||||
void on_cbFirst_toggled(bool b);
|
||||
void on_cbWeak_toggled(bool b);
|
||||
void on_cbAutoSeq_toggled(bool b);
|
||||
void networkError (QString const&);
|
||||
void on_ClrAvgButton_clicked();
|
||||
@@ -277,6 +286,13 @@ private slots:
|
||||
void on_actionQRA64_triggered();
|
||||
void on_actionFreqCal_triggered();
|
||||
void splash_done ();
|
||||
void on_measure_check_box_stateChanged (int);
|
||||
void on_sbNlist_valueChanged(int n);
|
||||
void on_sbNslots_valueChanged(int n);
|
||||
void on_sbMax_dB_valueChanged(int n);
|
||||
void on_pbFoxReset_clicked();
|
||||
void on_comboBoxHoundSort_activated (int index);
|
||||
void not_GA_warning_message ();
|
||||
|
||||
private:
|
||||
Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
|
||||
@@ -305,8 +321,9 @@ private:
|
||||
private:
|
||||
void astroUpdate ();
|
||||
void writeAllTxt(QString message);
|
||||
void auto_sequence (QString const& message, unsigned tolerance);
|
||||
void auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance);
|
||||
void hideMenus(bool b);
|
||||
void foxTest();
|
||||
|
||||
NetworkAccessManager m_network_manager;
|
||||
bool m_valid;
|
||||
@@ -352,6 +369,9 @@ private:
|
||||
qint64 m_msErase;
|
||||
qint64 m_secBandChanged;
|
||||
qint64 m_freqMoon;
|
||||
qint64 m_msec0;
|
||||
qint64 m_fullFoxCallTime;
|
||||
|
||||
Frequency m_freqNominal;
|
||||
Frequency m_freqTxNominal;
|
||||
Astro::Correction m_astroCorrection;
|
||||
@@ -397,10 +417,29 @@ private:
|
||||
qint32 m_k0;
|
||||
qint32 m_kdone;
|
||||
qint32 m_nPick;
|
||||
FrequencyList::const_iterator m_frequency_list_fcal_iter;
|
||||
FrequencyList_v2::const_iterator m_frequency_list_fcal_iter;
|
||||
qint32 m_nTx73;
|
||||
qint32 m_UTCdisk;
|
||||
qint32 m_wait;
|
||||
qint32 m_i3bit;
|
||||
qint32 m_isort;
|
||||
qint32 m_max_dB;
|
||||
qint32 m_nDXped=0;
|
||||
qint32 m_nSortedHounds=0;
|
||||
qint32 m_nHoundsCalling=0;
|
||||
qint32 m_Nlist=12;
|
||||
qint32 m_Nslots=5;
|
||||
qint32 m_nFoxMsgTimes[5]={0,0,0,0,0};
|
||||
qint32 m_tAutoOn;
|
||||
// qint32 m_maxQSOs;
|
||||
qint32 m_tFoxTx=0;
|
||||
qint32 m_tFoxTx0=0;
|
||||
qint32 m_maxStrikes=3; //Max # of repeats: 3 strikes and you're out
|
||||
qint32 m_maxFoxWait=3; //Max wait time for expected Hound replies
|
||||
qint32 m_foxCQtime=10; //CQs at least every 5 minutes
|
||||
qint32 m_tFoxTxSinceCQ=999; //Fox Tx cycles since most recent CQ
|
||||
qint32 m_nFoxFreq; //Audio freq at which Hound received a call from Fox
|
||||
qint32 m_nSentFoxRrpt=0; //Serial number for next R+rpt Hound will send to Fox
|
||||
|
||||
bool m_btxok; //True if OK to transmit
|
||||
bool m_diskData;
|
||||
@@ -425,7 +464,6 @@ private:
|
||||
QString m_currentMessage;
|
||||
int m_lastMessageType;
|
||||
QString m_lastMessageSent;
|
||||
bool m_lockTxFreq;
|
||||
bool m_bShMsgs;
|
||||
bool m_bSWL;
|
||||
bool m_uploadSpots;
|
||||
@@ -454,6 +492,10 @@ private:
|
||||
bool m_bDoubleClicked;
|
||||
bool m_bCallingCQ;
|
||||
bool m_bAutoReply;
|
||||
bool m_bCheckedContest;
|
||||
bool m_bWarnedSplit=false;
|
||||
bool m_bWarnedHound=false;
|
||||
|
||||
enum
|
||||
{
|
||||
CALLING,
|
||||
@@ -533,15 +575,39 @@ private:
|
||||
QString m_msgSent0;
|
||||
QString m_fileToSave;
|
||||
QString m_calls;
|
||||
QString m_CQtype;
|
||||
QString m_opCall;
|
||||
QString m_houndCallers; //Sorted list of Hound callers
|
||||
QString m_fm0;
|
||||
QString m_fm1;
|
||||
|
||||
QSet<QString> m_pfx;
|
||||
QSet<QString> m_sfx;
|
||||
|
||||
struct FoxQSO //Everything we need to know about QSOs in progress (or recently logged).
|
||||
{
|
||||
QString grid; //Hound's declared locator
|
||||
QString sent; //Report sent to Hound
|
||||
QString rcvd; //Report received from Hound
|
||||
qint32 ncall; //Number of times report sent to Hound
|
||||
qint32 nRR73; //Number of times RR73 sent to Hound
|
||||
qint32 tFoxRrpt; //m_tFoxTx (Fox Tx cycle counter) when R+rpt was received from Hound
|
||||
qint32 tFoxTxRR73; //m_tFoxTx when RR73 was sent to Hound
|
||||
};
|
||||
|
||||
QMap<QString,FoxQSO> m_foxQSO; //Key = HoundCall, value = parameters for QSO in progress
|
||||
QMap<QString,QString> m_loggedByFox; //Key = HoundCall, value = logged band
|
||||
|
||||
QQueue<QString> m_houndQueue; //Selected Hounds available for starting a QSO
|
||||
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
|
||||
QQueue<qint64> m_foxRateQueue;
|
||||
|
||||
QDateTime m_dateTimeQSOOn;
|
||||
QDateTime m_dateTimeLastTX;
|
||||
|
||||
QSharedMemory *mem_jt9;
|
||||
LogBook m_logBook;
|
||||
DecodedText m_QSOText;
|
||||
QString m_QSOText;
|
||||
unsigned m_msAudioOutputBuffered;
|
||||
unsigned m_framesAudioInputBuffered;
|
||||
unsigned m_downSampleFactor;
|
||||
@@ -556,6 +622,7 @@ private:
|
||||
bool m_block_pwr_tooltip;
|
||||
bool m_PwrBandSetOK;
|
||||
bool m_bVHFwarned;
|
||||
bool m_bDisplayedOnce;
|
||||
Frequency m_lastMonitoredFrequency;
|
||||
double m_toneSpacing;
|
||||
int m_firstDecode;
|
||||
@@ -571,6 +638,7 @@ private:
|
||||
|
||||
//---------------------------------------------------- private functions
|
||||
void readSettings();
|
||||
void set_application_font (QFont const&);
|
||||
void setDecodedTextFont (QFont const&);
|
||||
void writeSettings();
|
||||
void createStatusBar();
|
||||
@@ -578,8 +646,7 @@ private:
|
||||
void genStdMsgs(QString rpt, bool unconditional = false);
|
||||
void genCQMsg();
|
||||
void clearDX ();
|
||||
void lookup (bool extend_grid = false); // extend_grid will fetch a
|
||||
// 6-digit grid if available
|
||||
void lookup();
|
||||
void ba2msg(QByteArray ba, char* message);
|
||||
void msgtype(QString t, QLineEdit* tx);
|
||||
void stub();
|
||||
@@ -589,11 +656,12 @@ private:
|
||||
void transmit (double snr = 99.);
|
||||
void rigFailure (QString const& reason);
|
||||
void pskSetLocal ();
|
||||
void pskPost(DecodedText decodedtext);
|
||||
void pskPost(DecodedText const& decodedtext);
|
||||
void displayDialFrequency ();
|
||||
void transmitDisplay (bool);
|
||||
void processMessage(QString const& messages, qint32 position, bool ctrl = false, bool alt = false);
|
||||
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text);
|
||||
void processMessage(DecodedText const&, Qt::KeyboardModifiers = 0);
|
||||
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence, quint8 modifiers);
|
||||
void locationChange(QString const& location);
|
||||
void replayDecodes ();
|
||||
void postDecode (bool is_new, QString const& message);
|
||||
void postWSPRDecode (bool is_new, QStringList message_parts);
|
||||
@@ -616,6 +684,9 @@ private:
|
||||
, Frequency frequency
|
||||
, QString const& his_call
|
||||
, QString const& his_grid) const;
|
||||
void hound_reply ();
|
||||
QString sortHoundCalls(QString t, int isort, int max_dB);
|
||||
void rm_tb4(QString houndCall);
|
||||
void read_wav_file (QString const& fname);
|
||||
void decodeDone ();
|
||||
void subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus);
|
||||
@@ -627,12 +698,18 @@ private:
|
||||
void remove_child_from_event_filter (QObject *);
|
||||
void setup_status_bar (bool vhf);
|
||||
void tx_watchdog (bool triggered);
|
||||
int nWidgets(QString t);
|
||||
void displayWidgets(int n);
|
||||
qint64 nWidgets(QString t);
|
||||
void displayWidgets(qint64 n);
|
||||
void vhfWarning();
|
||||
QChar current_submode () const; // returns QChar {0} if sub mode is
|
||||
// not appropriate
|
||||
void write_transmit_entry (QString const& file_name);
|
||||
void selectHound(QString t);
|
||||
void houndCallers();
|
||||
void foxRxSequencer(QString msg, QString houndCall, QString rptRcvd);
|
||||
void foxTxSequencer();
|
||||
void foxGenWaveform(int i,QString fm);
|
||||
void writeFoxQSO(QString msg);
|
||||
};
|
||||
|
||||
extern int killbyname(const char* progName);
|
||||
Reference in New Issue
Block a user