mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-23 20:58:55 -05:00
Many changes. Waterfall plots now pretty much OK. (May want to limit
displayed range to 1000 Hz.) Noise blanking may be working -- needs tests. Tx has been implemented. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2648 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
41c25dbc01
commit
8fbb6bac79
@ -70,7 +70,7 @@ subroutine symspec(k,ntrperiod,nsps,ndiskdat,nb,nbslider,pxdb,s,f0a,df3, &
|
|||||||
k0=k
|
k0=k
|
||||||
|
|
||||||
nzap=0
|
nzap=0
|
||||||
sigmas=1.5*(10.0**(0.01*nbslider)) + 0.7
|
sigmas=1.0*(10.0**(0.01*nbslider)) + 0.7
|
||||||
peaklimit=sigmas*max(10.0,rms)
|
peaklimit=sigmas*max(10.0,rms)
|
||||||
faclim=3.0
|
faclim=3.0
|
||||||
px=0.
|
px=0.
|
||||||
@ -104,7 +104,7 @@ subroutine symspec(k,ntrperiod,nsps,ndiskdat,nb,nbslider,pxdb,s,f0a,df3, &
|
|||||||
!###
|
!###
|
||||||
! if(nzap/178.lt.50 .and. (ndiskdat.eq.0 .or. ihsym.lt.280)) then
|
! if(nzap/178.lt.50 .and. (ndiskdat.eq.0 .or. ihsym.lt.280)) then
|
||||||
if(nsum.le.0) nsum=1
|
if(nsum.le.0) nsum=1
|
||||||
rms=sqrt(0.5*px/nsum)
|
rms=sqrt(px/nsum)
|
||||||
! endif
|
! endif
|
||||||
pxdb=0.
|
pxdb=0.
|
||||||
if(rms.gt.0.0) pxdb=20.0*log10(rms)
|
if(rms.gt.0.0) pxdb=20.0*log10(rms)
|
||||||
|
@ -66,22 +66,30 @@ subroutine timf2(x0,k,nfft,nwindow,nb,peaklimit,faclim,x1, &
|
|||||||
cxt(0:nh)=cx(0:nh)
|
cxt(0:nh)=cx(0:nh)
|
||||||
|
|
||||||
! Identify frequencies with strong signals.
|
! Identify frequencies with strong signals.
|
||||||
|
!###
|
||||||
ntot=ntot+1
|
|
||||||
if(mod(ntot,128).eq.5) then
|
|
||||||
call pctile(s,stmp,nh,50,xmedian)
|
|
||||||
slimit=faclim*xmedian
|
|
||||||
endif
|
|
||||||
|
|
||||||
if(ntc.lt.12000/nfft) ntc=ntc+1
|
|
||||||
uu=1.0/ntc
|
|
||||||
smax=0.
|
|
||||||
do i=0,nh
|
do i=0,nh
|
||||||
p=real(cxt(i))**2 + aimag(cxt(i))**2
|
p=real(cxt(i))**2 + aimag(cxt(i))**2
|
||||||
s(i)=(1.0-uu)*s(i) + uu*p
|
s(i)=p
|
||||||
lstrong(i)=(s(i).gt.slimit)
|
|
||||||
if(s(i).gt.smax) smax=s(i)
|
|
||||||
enddo
|
enddo
|
||||||
|
ave=sum(s(0:nh))/nh
|
||||||
|
lstrong(0:nh)=s(0:nh).gt.10.0*ave
|
||||||
|
!###
|
||||||
|
|
||||||
|
! ntot=ntot+1
|
||||||
|
! if(mod(ntot,128).eq.5) then
|
||||||
|
! call pctile(s,stmp,nh,50,xmedian)
|
||||||
|
! slimit=faclim*xmedian
|
||||||
|
! endif
|
||||||
|
|
||||||
|
! if(ntc.lt.12000/nfft) ntc=ntc+1
|
||||||
|
! uu=1.0/ntc
|
||||||
|
! smax=0.
|
||||||
|
! do i=0,nh
|
||||||
|
! p=real(cxt(i))**2 + aimag(cxt(i))**2
|
||||||
|
! s(i)=(1.0-uu)*s(i) + uu*p
|
||||||
|
! lstrong(i)=(s(i).gt.slimit)
|
||||||
|
! if(s(i).gt.smax) smax=s(i)
|
||||||
|
! enddo
|
||||||
|
|
||||||
nsigs=0
|
nsigs=0
|
||||||
lprev=.false.
|
lprev=.false.
|
||||||
@ -146,7 +154,7 @@ subroutine timf2(x0,k,nfft,nwindow,nb,peaklimit,faclim,x1, &
|
|||||||
|
|
||||||
! Compute power levels from weak data only
|
! Compute power levels from weak data only
|
||||||
do i=0,kstep-1
|
do i=0,kstep-1
|
||||||
px=px + xw(i)*xw(i)
|
px=px + xw(i)**2
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
x1(0:kstep-1)=xw(0:kstep-1) + xs(0:kstep-1) !Recombine weak + strong
|
x1(0:kstep-1)=xw(0:kstep-1) + xs(0:kstep-1) !Recombine weak + strong
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "sleep.h"
|
#include "sleep.h"
|
||||||
#include <portaudio.h>
|
#include <portaudio.h>
|
||||||
|
|
||||||
short int iwave[30*48000]; //Wave file for Tx audio
|
int itone[85]; //Tx audio tones for 85 symbols
|
||||||
int nwave; //Length of Tx waveform
|
int nwave; //Length of Tx waveform
|
||||||
bool btxok; //True if OK to transmit
|
bool btxok; //True if OK to transmit
|
||||||
double outputLatency; //Latency in seconds
|
double outputLatency; //Latency in seconds
|
||||||
@ -675,7 +675,7 @@ void MainWindow::on_actionOpen_triggered() //Open File
|
|||||||
m_diskData=true;
|
m_diskData=true;
|
||||||
int dbDgrd=0;
|
int dbDgrd=0;
|
||||||
*future1 = QtConcurrent::run(getfile, fname, m_TRperiod);
|
*future1 = QtConcurrent::run(getfile, fname, m_TRperiod);
|
||||||
watcher1->setFuture(*future1);
|
watcher1->setFuture(*future1); // call diskDat() when done
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -848,7 +848,8 @@ void MainWindow::guiUpdate()
|
|||||||
int khsym=0;
|
int khsym=0;
|
||||||
|
|
||||||
double tx1=0.0;
|
double tx1=0.0;
|
||||||
double tx2=m_TRperiod;
|
// double tx2=m_TRperiod;
|
||||||
|
double tx2=1.0 + 85.0*m_nsps/12000.0;
|
||||||
|
|
||||||
if(!m_txFirst) {
|
if(!m_txFirst) {
|
||||||
tx1 += m_TRperiod;
|
tx1 += m_TRperiod;
|
||||||
@ -892,8 +893,9 @@ void MainWindow::guiUpdate()
|
|||||||
|
|
||||||
ba2msg(ba,message);
|
ba2msg(ba,message);
|
||||||
ba2msg(ba,msgsent);
|
ba2msg(ba,msgsent);
|
||||||
int len1=28;
|
int len1=22;
|
||||||
// genjt9_(message,iwave,&nwave,len1);
|
int len2=22;
|
||||||
|
genjt9_(message,&m_TRperiod,msgsent,itone,len1,len2);
|
||||||
if(m_restart) {
|
if(m_restart) {
|
||||||
QFile f("wsjtx_tx.log");
|
QFile f("wsjtx_tx.log");
|
||||||
f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
|
f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
|
||||||
@ -983,7 +985,7 @@ void MainWindow::guiUpdate()
|
|||||||
ui->labUTC->setText(utc);
|
ui->labUTC->setText(utc);
|
||||||
if(!m_monitoring and !m_diskData) {
|
if(!m_monitoring and !m_diskData) {
|
||||||
ui->xThermo->setValue(0.0); // Set Rx level to 20
|
ui->xThermo->setValue(0.0); // Set Rx level to 20
|
||||||
lab2->setText(" Rx noise: 0.0 ");
|
// lab4->setText(" Rx noise: 0.0 ");
|
||||||
}
|
}
|
||||||
m_hsym0=khsym;
|
m_hsym0=khsym;
|
||||||
m_sec0=nsec;
|
m_sec0=nsec;
|
||||||
@ -1362,7 +1364,7 @@ void MainWindow::on_actionJT9_30_triggered()
|
|||||||
{
|
{
|
||||||
m_mode="JT9-30";
|
m_mode="JT9-30";
|
||||||
m_TRperiod=1800;
|
m_TRperiod=1800;
|
||||||
m_nsps=250880;
|
m_nsps=252000;
|
||||||
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
||||||
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
||||||
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||||
|
@ -221,7 +221,7 @@ void symspec_(int* k, int* ntrperiod, int* nsps, int* ndiskdat,
|
|||||||
int* nb, int* m_NBslider, float* px, float s[],
|
int* nb, int* m_NBslider, float* px, float s[],
|
||||||
float* f0a, float* df3, int* nhsym, int* nzap,
|
float* f0a, float* df3, int* nhsym, int* nzap,
|
||||||
float* slimit, uchar lstrong[]);
|
float* slimit, uchar lstrong[]);
|
||||||
void genJT9_(char* msg, char* msgsent, short itone[], int* nsym,
|
void genjt9_(char* msg, int* minutes, char* msgsent, int itone[],
|
||||||
int len1, int len2);
|
int len1, int len2);
|
||||||
int ptt_(int* nport, int* itx, int* iptt);
|
int ptt_(int* nport, int* itx, int* iptt);
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ void CPlotter::draw(float swide[], int i0, float splot[]) //draw()
|
|||||||
m_line++;
|
m_line++;
|
||||||
if(m_line == 13) {
|
if(m_line == 13) {
|
||||||
UTCstr();
|
UTCstr();
|
||||||
painter1.setPen(Qt::white);
|
painter1.setPen(Qt::red);
|
||||||
painter1.drawText(5,10,m_sutc);
|
painter1.drawText(5,10,m_sutc);
|
||||||
}
|
}
|
||||||
update(); //trigger a new paintEvent
|
update(); //trigger a new paintEvent
|
||||||
|
@ -138,13 +138,15 @@ void SoundInThread::run() //SoundInThread::run()
|
|||||||
k=udata.kin;
|
k=udata.kin;
|
||||||
if(m_monitoring) {
|
if(m_monitoring) {
|
||||||
int kstep=m_nsps/2;
|
int kstep=m_nsps/2;
|
||||||
m_step=k/kstep;
|
// m_step=k/kstep;
|
||||||
|
m_step=(k-1)/kstep;
|
||||||
if(m_step != nstep0) {
|
if(m_step != nstep0) {
|
||||||
if(m_dataSinkBusy) {
|
if(m_dataSinkBusy) {
|
||||||
nBusy++;
|
nBusy++;
|
||||||
} else {
|
} else {
|
||||||
// m_dataSinkBusy=true;
|
// m_dataSinkBusy=true;
|
||||||
emit readyForFFT(k); //Signal to compute new FFTs
|
// emit readyForFFT(k); //Signal to compute new FFTs
|
||||||
|
emit readyForFFT(k-1); //Signal to compute new FFTs
|
||||||
}
|
}
|
||||||
nstep0=m_step;
|
nstep0=m_step;
|
||||||
}
|
}
|
||||||
|
73
soundout.cpp
73
soundout.cpp
@ -7,14 +7,16 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern float gran(); //Noise generator (for tests only)
|
extern float gran(); //Noise generator (for tests only)
|
||||||
extern short int iwave[120*12000]; //Wave file for Tx audio
|
extern int itone[85]; //Tx audio tones for 85 symbols
|
||||||
extern int nwave;
|
|
||||||
extern bool btxok;
|
|
||||||
extern double outputLatency;
|
extern double outputLatency;
|
||||||
|
|
||||||
typedef struct //Parameters sent to or received from callback function
|
typedef struct //Parameters sent to or received from callback function
|
||||||
{
|
{
|
||||||
int dummy;
|
int nsps;
|
||||||
|
int ntrperiod;
|
||||||
|
bool txOK;
|
||||||
|
bool txMute;
|
||||||
|
bool bRestart;
|
||||||
} paUserData;
|
} paUserData;
|
||||||
|
|
||||||
//--------------------------------------------------------------- d2aCallback
|
//--------------------------------------------------------------- d2aCallback
|
||||||
@ -26,20 +28,50 @@ extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer,
|
|||||||
{
|
{
|
||||||
paUserData *udata=(paUserData*)userData;
|
paUserData *udata=(paUserData*)userData;
|
||||||
short *wptr = (short*)outputBuffer;
|
short *wptr = (short*)outputBuffer;
|
||||||
unsigned int i;
|
|
||||||
static int ic=0;
|
|
||||||
|
|
||||||
for(i=0 ; i<framesToProcess; i++ ) {
|
static double twopi=6.283185307;
|
||||||
short int i2=iwave[ic];
|
static double baud=12000.0/udata->nsps;
|
||||||
if(ic > nwave) i2=0;
|
static double phi=0.0;
|
||||||
|
static double dphi;
|
||||||
|
static double freq;
|
||||||
|
static int ic=0;
|
||||||
|
static short int i2;
|
||||||
|
|
||||||
|
if(udata->bRestart) {
|
||||||
|
// Time according to this computer
|
||||||
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
|
int mstr = ms % (1000*udata->ntrperiod );
|
||||||
|
if(mstr<1000) return 0;
|
||||||
|
ic=(mstr-1000)*12;
|
||||||
|
qDebug() << "Start at:" << 0.001*mstr;
|
||||||
|
udata->bRestart=false;
|
||||||
|
}
|
||||||
|
int isym=ic/udata->nsps;
|
||||||
|
if(isym>=85) return 0;
|
||||||
|
freq=1500.0 + itone[isym]*baud;
|
||||||
|
dphi=twopi*freq/12000.0;
|
||||||
|
/*
|
||||||
|
if(ic<10000) qDebug() << "a" << ic << udata->nsps << itone[0]
|
||||||
|
<< itone[1] << itone[2] << itone[3] << itone[4]
|
||||||
|
<< itone[5] << itone[6] << itone[7] << itone[8]
|
||||||
|
<< itone[9] << itone[10] << itone[11] << itone[12]
|
||||||
|
<< itone[13] << itone[14] << itone[15] << itone[16];
|
||||||
|
*/
|
||||||
|
// qDebug() << ic << isym << freq << dphi << phi << i2;
|
||||||
|
|
||||||
|
for(int i=0 ; i<framesToProcess; i++ ) {
|
||||||
|
phi += dphi;
|
||||||
|
if(phi>twopi) phi -= twopi;
|
||||||
|
i2=32767.0*sin(phi);
|
||||||
// i2 = 500.0*(i2/32767.0 + 5.0*gran()); //Add noise (tests only!)
|
// i2 = 500.0*(i2/32767.0 + 5.0*gran()); //Add noise (tests only!)
|
||||||
if(!btxok) i2=0;
|
/*
|
||||||
|
if(udata->txMute) i2=0;
|
||||||
|
if(!udata->txOK) i2=0;
|
||||||
|
if(ic > 85*udata->nsps) i2=0;
|
||||||
|
*/
|
||||||
*wptr++ = i2; //left
|
*wptr++ = i2; //left
|
||||||
ic++;
|
ic++;
|
||||||
}
|
}
|
||||||
if(ic >= nwave) {
|
|
||||||
ic=0;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,8 +96,11 @@ void SoundOutThread::run()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// udata.nwave=m_nwave;
|
udata.nsps=m_nsps;
|
||||||
// udata.btxok=false;
|
udata.ntrperiod=m_TRperiod;
|
||||||
|
udata.txOK=false;
|
||||||
|
udata.txMute=m_txMute;
|
||||||
|
udata.bRestart=true;
|
||||||
|
|
||||||
paerr=Pa_OpenStream(&outStream, //Output stream
|
paerr=Pa_OpenStream(&outStream, //Output stream
|
||||||
NULL, //No input parameters
|
NULL, //No input parameters
|
||||||
@ -89,9 +124,11 @@ void SoundOutThread::run()
|
|||||||
while (!qe) {
|
while (!qe) {
|
||||||
qe = quitExecution;
|
qe = quitExecution;
|
||||||
if (qe) break;
|
if (qe) break;
|
||||||
// udata.nwave=m_nwave;
|
|
||||||
// if(m_txOK) udata.btxok=1;
|
udata.nsps=m_nsps;
|
||||||
// if(!m_txOK) udata.btxok=0;
|
udata.ntrperiod=m_TRperiod;
|
||||||
|
udata.txOK=m_txOK;
|
||||||
|
udata.txMute=m_txMute;
|
||||||
msleep(100);
|
msleep(100);
|
||||||
}
|
}
|
||||||
Pa_StopStream(outStream);
|
Pa_StopStream(outStream);
|
||||||
|
@ -33,7 +33,7 @@ private:
|
|||||||
qint32 m_nDevOut; //Output device number
|
qint32 m_nDevOut; //Output device number
|
||||||
bool m_txOK; //Enable Tx audio
|
bool m_txOK; //Enable Tx audio
|
||||||
bool m_txMute; //Mute temporarily
|
bool m_txMute; //Mute temporarily
|
||||||
qint32 m_TRperiod; //T/R period (30 or 60 s)
|
qint32 m_TRperiod; //T/R period (s)
|
||||||
qint32 m_nsps; //Samples per symbol (at 12000 Hz)
|
qint32 m_nsps; //Samples per symbol (at 12000 Hz)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user