mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-28 07:08:40 -05:00
8794bad146
By using the local 8-bit character set we can allow local non-ASCII characters in file paths, for example user account names on MS Windows with characters in the default code page.
108 lines
2.6 KiB
C++
108 lines
2.6 KiB
C++
#include "getfile.h"
|
|
#include <QDir>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
|
|
extern qint16 id[4*60*96000];
|
|
|
|
void getfile(QString fname, bool xpol, int dbDgrd)
|
|
{
|
|
int npts=2*56*96000;
|
|
if(xpol) npts=2*npts;
|
|
|
|
// Degrade S/N by dbDgrd dB -- for tests only!!
|
|
float dgrd=0.0;
|
|
if(dbDgrd<0) dgrd = 23.0*sqrt(pow(10.0,-0.1*(double)dbDgrd) - 1.0);
|
|
float fac=23.0/sqrt(dgrd*dgrd + 23.0*23.0);
|
|
|
|
memset(id,0,2*npts);
|
|
char name[80];
|
|
strcpy(name,fname.toLocal8Bit());
|
|
FILE* fp=fopen(name,"rb");
|
|
|
|
if(fp != NULL) {
|
|
auto n = fread(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp);
|
|
n = fread(id,2,npts,fp);
|
|
Q_UNUSED (n);
|
|
int j=0;
|
|
|
|
if(dbDgrd<0) {
|
|
for(int i=0; i<npts; i+=2) {
|
|
datcom_.d4[j++]=fac*((float)id[i] + dgrd*gran());
|
|
datcom_.d4[j++]=fac*((float)id[i+1] + dgrd*gran());
|
|
if(!xpol) j+=2; //Skip over d4(3,x) and d4(4,x)
|
|
}
|
|
} else {
|
|
for(int i=0; i<npts; i+=2) {
|
|
datcom_.d4[j++]=(float)id[i];
|
|
datcom_.d4[j++]=(float)id[i+1];
|
|
if(!xpol) j+=2; //Skip over d4(3,x) and d4(4,x)
|
|
}
|
|
}
|
|
fclose(fp);
|
|
|
|
datcom_.ndiskdat=1;
|
|
int nfreq=(int)datcom_.fcenter;
|
|
if(nfreq!=144 and nfreq != 432 and nfreq != 1296) datcom_.fcenter=144.125;
|
|
int i0=fname.indexOf(".tf2");
|
|
if(i0<0) i0=fname.indexOf(".iq");
|
|
datcom_.nutc=0;
|
|
if(i0>0) {
|
|
datcom_.nutc=100*fname.mid(i0-4,2).toInt() + fname.mid(i0-2,2).toInt();
|
|
}
|
|
}
|
|
}
|
|
|
|
void savetf2(QString fname, bool xpol)
|
|
{
|
|
int npts=2*56*96000;
|
|
if(xpol) npts=2*npts;
|
|
|
|
qint16* buf=(qint16*)malloc(2*npts);
|
|
char name[80];
|
|
strcpy(name,fname.toLocal8Bit());
|
|
FILE* fp=fopen(name,"wb");
|
|
|
|
if(fp != NULL) {
|
|
fwrite(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp);
|
|
int j=0;
|
|
for(int i=0; i<npts; i+=2) {
|
|
buf[i]=(qint16)datcom_.d4[j++];
|
|
buf[i+1]=(qint16)datcom_.d4[j++];
|
|
if(!xpol) j+=2; //Skip over d4(3,x) and d4(4,x)
|
|
}
|
|
fwrite(buf,2,npts,fp);
|
|
fclose(fp);
|
|
}
|
|
free(buf);
|
|
}
|
|
|
|
//#define MAX_RANDOM 0x7fffffff
|
|
|
|
/* Generate gaussian random float with mean=0 and std_dev=1 */
|
|
float gran()
|
|
{
|
|
float fac,rsq,v1,v2;
|
|
static float gset;
|
|
static int iset;
|
|
|
|
if(iset){
|
|
/* Already got one */
|
|
iset = 0;
|
|
return gset;
|
|
}
|
|
/* Generate two evenly distributed numbers between -1 and +1
|
|
* that are inside the unit circle
|
|
*/
|
|
do {
|
|
v1 = 2.0 * (float)rand() / RAND_MAX - 1;
|
|
v2 = 2.0 * (float)rand() / RAND_MAX - 1;
|
|
rsq = v1*v1 + v2*v2;
|
|
} while(rsq >= 1.0 || rsq == 0.0);
|
|
fac = sqrt(-2.0*log(rsq)/rsq);
|
|
gset = v1*fac;
|
|
iset++;
|
|
return v2*fac;
|
|
}
|