mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-22 12:08:43 -04:00
Normalize the current and cumulative plots automatically.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2659 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
d805132e17
commit
e6b515a9f1
@ -1,96 +0,0 @@
|
||||
subroutine genjt8(message,iwave,nwave,nbit,msgsent)
|
||||
|
||||
! Generate a JT8 wavefile.
|
||||
|
||||
parameter (NMAX=60*12000) !Max length of wave file
|
||||
character*24 message !Message to be generated
|
||||
character*24 msgsent !Message as it will be received
|
||||
character cmode*5
|
||||
real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsymbol
|
||||
integer*2 iwave(NMAX) !Generated wave file
|
||||
integer iu(3)
|
||||
integer gsym(372) !372 is needed for JT8 mode
|
||||
integer sent(144)
|
||||
integer ic8(8)
|
||||
data ic8/3,6,2,4,5,0,7,1/
|
||||
data nsps/4096/
|
||||
data twopi/6.283185307d0/
|
||||
save
|
||||
|
||||
cmode='JT8' !### temp ? ###
|
||||
call srcenc(cmode,message,nbit,iu)
|
||||
! In JT8 mode, message length is always nbit=78
|
||||
if(nbit.ne.78) then
|
||||
print*,'genjt8, nbit=',nbit
|
||||
stop
|
||||
endif
|
||||
|
||||
! Apply FEC and do the channel encoding
|
||||
call chenc(cmode,nbit,iu,gsym)
|
||||
|
||||
! Remove source encoding, recover the human-readable message.
|
||||
call srcdec(cmode,nbit,iu,msgsent)
|
||||
|
||||
! Insert 8x8 Costas array at beginning and end of array sent().
|
||||
sent(1:8)=ic8
|
||||
sent(135:142)=ic8
|
||||
! Insert two symbols after each Costas array to specify message length.
|
||||
if(nbit.eq.30) then
|
||||
sent(9)=2
|
||||
sent(10)=2
|
||||
sent(143)=2
|
||||
sent(144)=2
|
||||
else if(nbit.eq.48) then
|
||||
sent(9)=3
|
||||
sent(10)=3
|
||||
sent(143)=3
|
||||
sent(144)=3
|
||||
else
|
||||
sent(9)=6
|
||||
sent(10)=6
|
||||
sent(143)=6
|
||||
sent(144)=6
|
||||
endif
|
||||
|
||||
! Insert the 3-bit data symbols
|
||||
sent(11:134)=gsym(1:124)
|
||||
|
||||
! Use the four free symbols in 30-bit mode
|
||||
if(nbit.eq.30) then
|
||||
sent(121)=sent(20)
|
||||
sent(122)=sent(45)
|
||||
sent(123)=sent(70)
|
||||
sent(124)=sent(95)
|
||||
endif
|
||||
|
||||
! Set up necessary constants
|
||||
nsym=144
|
||||
tsymbol=nsps/12000.d0
|
||||
dt=1.d0/12000.d0
|
||||
f0=1270.46d0
|
||||
dfgen=12000.d0/nsps
|
||||
t=0.d0
|
||||
phi=0.d0
|
||||
k=0
|
||||
j0=0
|
||||
ndata=(nsym*12000.d0*tsymbol)/2
|
||||
ndata=2*ndata
|
||||
do i=1,ndata
|
||||
t=t+dt
|
||||
j=int(t/tsymbol) + 1 !Symbol number, 1-nsym
|
||||
if(j.ne.j0) then
|
||||
f=f0
|
||||
k=k+1
|
||||
if(k.le.144) f=f0+(sent(k))*dfgen !### Fix need for this ###
|
||||
dphi=twopi*dt*f
|
||||
j0=j
|
||||
endif
|
||||
phi=phi+dphi
|
||||
iwave(i)=32767.0*sin(phi)
|
||||
enddo
|
||||
|
||||
iwave(ndata+1:)=0
|
||||
nwave=ndata+6000 !0.5 s buffer before CW ID
|
||||
|
||||
return
|
||||
end subroutine genjt8
|
13
lib/pctile.f
13
lib/pctile.f
@ -1,13 +0,0 @@
|
||||
subroutine pctile(x,tmp,nmax,npct,xpct)
|
||||
real x(nmax),tmp(nmax)
|
||||
|
||||
do i=1,nmax
|
||||
tmp(i)=x(i)
|
||||
enddo
|
||||
call sort(nmax,tmp)
|
||||
j=nint(nmax*0.01*npct)
|
||||
if(j.lt.1) j=1
|
||||
xpct=tmp(j)
|
||||
|
||||
return
|
||||
end
|
25
lib/pctile.f90
Normal file
25
lib/pctile.f90
Normal file
@ -0,0 +1,25 @@
|
||||
subroutine pctile(x,npts,npct,xmedian)
|
||||
|
||||
real x(npts)
|
||||
integer hist(0:1000)
|
||||
|
||||
ave=sum(x)/npts
|
||||
hist=0
|
||||
do i=1,npts
|
||||
j=nint(100.0*x(i)/ave)
|
||||
if(j.lt.0) j=0
|
||||
if(j.gt.1000) j=1000
|
||||
hist(j)=hist(j)+1
|
||||
enddo
|
||||
|
||||
nsum=0
|
||||
ntest=nint(npts*float(npct)/100.0)
|
||||
do j=0,1000
|
||||
nsum=nsum+hist(j)
|
||||
if(nsum.ge.ntest) exit
|
||||
enddo
|
||||
|
||||
xmedian=j*ave/100.0
|
||||
|
||||
return
|
||||
end subroutine pctile
|
@ -24,10 +24,10 @@ subroutine symspec(k,ntrperiod,nsps,ndiskdat,nb,nbslider,pxdb,s,f0a,df3, &
|
||||
parameter (NFFT2=1024,NFFT2A=NFFT2/8)
|
||||
parameter (MAXFFT3=32768)
|
||||
real*4 s(NSMAX),w(NFFT1),w3(MAXFFT3)
|
||||
real*4 stmp(NFFT2/2)
|
||||
real*4 x0(NFFT1),x1(NFFT1)
|
||||
real*4 x2(NFFT1+105)
|
||||
real*4 xx(NMAX)
|
||||
real*4 ssum(NSMAX)
|
||||
complex cx(0:MAXFFT3-1)
|
||||
logical*1 lstrong(0:1023) !Should be (0:512)
|
||||
integer*2 id2
|
||||
@ -54,13 +54,12 @@ subroutine symspec(k,ntrperiod,nsps,ndiskdat,nb,nbslider,pxdb,s,f0a,df3, &
|
||||
do i=1,nfft3
|
||||
w3(i)=2.0*(sin(i*pi/nfft3))**2 !Window for nfft3
|
||||
enddo
|
||||
stmp=0.
|
||||
nfft3z=nfft3
|
||||
endif
|
||||
|
||||
if(k.lt.k0) then
|
||||
ja=-3*jstep
|
||||
savg=0.
|
||||
ssum=0.
|
||||
ihsym=0
|
||||
k1=0
|
||||
k8=0
|
||||
@ -131,15 +130,24 @@ subroutine symspec(k,ntrperiod,nsps,ndiskdat,nb,nbslider,pxdb,s,f0a,df3, &
|
||||
if(j.lt.0) j=j+nfft3
|
||||
sx=fac*(real(cx(j))**2 + aimag(cx(j))**2)
|
||||
ss(n,i)=sx
|
||||
savg(i)=savg(i) + sx
|
||||
ssum(i)=ssum(i) + sx
|
||||
s(i)=sx
|
||||
enddo
|
||||
endif
|
||||
|
||||
999 continue
|
||||
! write(71,3003) k,nsps,ihsym,nfft3,pxdb,df3,s(250)
|
||||
!3003 format(4i9,3f11.3)
|
||||
! flush(71)
|
||||
|
||||
|
||||
call pctile(s,iz,50,xmed0)
|
||||
s(1:iz)=s(1:iz)/xmed0
|
||||
call pctile(ssum,iz,50,xmed1)
|
||||
savg(1:iz)=ssum(1:iz)/xmed1
|
||||
|
||||
! if(ihsym.ge.1) then
|
||||
! write(71,3003) ihsym,ave0,xmed0,smax0,ave1,xmed1,smax1
|
||||
!3003 format(i3,6f12.6)
|
||||
! flush(71)
|
||||
! endif
|
||||
|
||||
return
|
||||
end subroutine symspec
|
||||
|
@ -77,7 +77,7 @@ subroutine timf2(x0,k,nfft,nwindow,nb,peaklimit,faclim,x1, &
|
||||
|
||||
! ntot=ntot+1
|
||||
! if(mod(ntot,128).eq.5) then
|
||||
! call pctile(s,stmp,nh,50,xmedian)
|
||||
! call pctile(s,nh,50,xmedian)
|
||||
! slimit=faclim*xmedian
|
||||
! endif
|
||||
|
||||
|
@ -330,7 +330,6 @@ void MainWindow::dataSink(int k)
|
||||
trmin=m_TRperiod/60;
|
||||
symspec_(&k, &trmin, &m_nsps, &ndiskdat, &nb, &m_NBslider, &px, s,
|
||||
&f0a, &df3, &ihsym, &nzap, &slimit, lstrong);
|
||||
// qDebug() << "a" << k << m_nsps << ihsym << px << df3 << s[250];
|
||||
if(ihsym <=0) return;
|
||||
QString t;
|
||||
m_pctZap=nzap/178.3;
|
||||
@ -367,7 +366,7 @@ void MainWindow::dataSink(int k)
|
||||
ntr0=ntr;
|
||||
n=0;
|
||||
}
|
||||
if(ihsym == 179) {
|
||||
if(ihsym == m_hsymStop) {
|
||||
jt9com_.newdat=1;
|
||||
jt9com_.nagain=0;
|
||||
QDateTime t = QDateTime::currentDateTimeUtc();
|
||||
@ -722,10 +721,10 @@ void MainWindow::diskDat() //diskDat()
|
||||
{
|
||||
int kstep=m_nsps/2;
|
||||
m_diskData=true;
|
||||
for(int n=1; n<=184; n++) { // Do the half-symbol FFTs
|
||||
for(int n=1; n<=m_hsymStop; n++) { // Do the half-symbol FFTs
|
||||
int k=(n+1)*kstep;
|
||||
dataSink(k);
|
||||
if(n%10 == 0) qApp->processEvents(); //Keep the GUI responsive
|
||||
if(n%10 == 1 or n == m_hsymStop) qApp->processEvents(); //Keep GUI responsive
|
||||
}
|
||||
}
|
||||
|
||||
@ -1317,6 +1316,7 @@ void MainWindow::on_actionJT9_1_triggered()
|
||||
m_mode="JT9-1";
|
||||
m_TRperiod=60;
|
||||
m_nsps=6912;
|
||||
m_hsymStop=181;
|
||||
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
||||
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
||||
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||
@ -1330,6 +1330,7 @@ void MainWindow::on_actionJT9_2_triggered()
|
||||
m_mode="JT9-2";
|
||||
m_TRperiod=120;
|
||||
m_nsps=15360;
|
||||
m_hsymStop=178;
|
||||
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
||||
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
||||
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||
@ -1343,6 +1344,7 @@ void MainWindow::on_actionJT9_5_triggered()
|
||||
m_mode="JT9-5";
|
||||
m_TRperiod=300;
|
||||
m_nsps=40960;
|
||||
m_hsymStop=172;
|
||||
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
||||
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
||||
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||
@ -1356,6 +1358,7 @@ void MainWindow::on_actionJT9_10_triggered()
|
||||
m_mode="JT9-10";
|
||||
m_TRperiod=600;
|
||||
m_nsps=82944;
|
||||
m_hsymStop=171;
|
||||
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
||||
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
||||
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||
@ -1369,6 +1372,7 @@ void MainWindow::on_actionJT9_30_triggered()
|
||||
m_mode="JT9-30";
|
||||
m_TRperiod=1800;
|
||||
m_nsps=252000;
|
||||
m_hsymStop=167;
|
||||
soundInThread.setPeriod(m_TRperiod,m_nsps);
|
||||
soundOutThread.setPeriod(m_TRperiod,m_nsps);
|
||||
g_pWideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||
|
@ -134,6 +134,7 @@ private:
|
||||
qint32 m_NBslider;
|
||||
qint32 m_TRperiod;
|
||||
qint32 m_nsps;
|
||||
qint32 m_hsymStop;
|
||||
|
||||
bool m_monitoring;
|
||||
bool m_transmitting;
|
||||
|
@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>602</width>
|
||||
<height>502</height>
|
||||
<height>480</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@ -19,7 +19,7 @@
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>500</height>
|
||||
<height>475</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
@ -35,13 +35,13 @@
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralWidget">
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<widget class="QWidget" name="">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>-10</y>
|
||||
<x>11</x>
|
||||
<y>2</y>
|
||||
<width>565</width>
|
||||
<height>467</height>
|
||||
<height>423</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
@ -62,7 +62,7 @@
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>620</width>
|
||||
<height>200</height>
|
||||
<height>300</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="title">
|
||||
@ -86,7 +86,7 @@
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>610</width>
|
||||
<height>180</height>
|
||||
<height>280</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
|
12
plotter.cpp
12
plotter.cpp
@ -67,8 +67,6 @@ void CPlotter::resizeEvent(QResizeEvent* ) //resizeEvent()
|
||||
m_2DPixmap.fill(Qt::black);
|
||||
m_ScalePixmap = QPixmap(m_w,30);
|
||||
m_ScalePixmap.fill(Qt::white);
|
||||
|
||||
qDebug() << "A" << m_h << m_h1 << m_h2 ;
|
||||
}
|
||||
DrawOverlay();
|
||||
}
|
||||
@ -119,18 +117,19 @@ void CPlotter::draw(float swide[], int i0) //draw()
|
||||
swide[i]=-swide[i];
|
||||
}
|
||||
y = 10.0*log10(swide[i]);
|
||||
int y1 = 5.0*gain*(y + 37 - m_plotZero);
|
||||
int y1 = 5.0*gain*y + 10*m_plotZero;
|
||||
if (y1<0) y1=0;
|
||||
if (y1>254) y1=254;
|
||||
if (swide[i]>1.e29) y1=255;
|
||||
m_hist1[y1]++;
|
||||
painter1.setPen(m_ColorTbl[y1]);
|
||||
painter1.drawPoint(i,0);
|
||||
int y2 = 0.7*gain*(y + 54 - m_plotZero);
|
||||
if(!m_bCurrent) y2=10.0*jt9com_.savg[i];
|
||||
int y2 = gain*y + 30;
|
||||
if(!m_bCurrent) y2=5.0*gain*jt9com_.savg[i] + 20;
|
||||
if (y2<0) y2=0;
|
||||
if (y2>254) y2=254;
|
||||
if (swide[i]>1.e29) y2=255;
|
||||
|
||||
if(strong != strong0 or i==m_w-1) {
|
||||
painter2D.drawPolyline(LineBuf,j);
|
||||
j=0;
|
||||
@ -139,7 +138,8 @@ void CPlotter::draw(float swide[], int i0) //draw()
|
||||
if(!strong0) painter2D.setPen(Qt::green);
|
||||
}
|
||||
LineBuf[j].setX(i);
|
||||
LineBuf[j].setY(m_h-y2-320);
|
||||
LineBuf[j].setY(m_h-(y2+180));
|
||||
// if(m_line==10) qDebug() << i << FreqfromX(i) << m_h << y2 << m_h-y2;
|
||||
j++;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user