WSJT-X/getfile.cpp
Joe Taylor c1e779f966 Better symspec now.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2646 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2012-10-04 19:03:39 +00:00

113 lines
2.2 KiB
C++

#include "getfile.h"
#include <QDir>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void getfile(QString fname, int ntrperiod)
{
char name[80];
strcpy(name,fname.toAscii());
FILE* fp=fopen(name,"rb");
int npts=ntrperiod*12000;
memset(jt9com_.d2,0,2*npts);
if(fp != NULL) {
// Read (and ignore) a 44-byte WAV header; then read data
fread(jt9com_.d2,1,44,fp);
int nrd=fread(jt9com_.d2,2,npts,fp);
fclose(fp);
}
}
void savewav(QString fname, int ntrperiod)
{
struct {
char ariff[4];
int nchunk;
char awave[4];
char afmt[4];
int lenfmt;
short int nfmt2;
short int nchan2;
int nsamrate;
int nbytesec;
short int nbytesam2;
short int nbitsam2;
char adata[4];
int ndata;
} hdr;
int npts=ntrperiod*12000;
// qint16* buf=(qint16*)malloc(2*npts);
char name[80];
strcpy(name,fname.toAscii());
FILE* fp=fopen(name,"wb");
if(fp != NULL) {
// Write a WAV header
hdr.ariff[0]='R';
hdr.ariff[1]='I';
hdr.ariff[2]='F';
hdr.ariff[3]='F';
hdr.nchunk=0;
hdr.awave[0]='W';
hdr.awave[0]='A';
hdr.awave[0]='V';
hdr.awave[0]='E';
hdr.afmt[0]='f';
hdr.afmt[1]='m';
hdr.afmt[2]='t';
hdr.afmt[3]=' ';
hdr.lenfmt=16;
hdr.nfmt2=1;
hdr.nchan2=1;
hdr.nsamrate=12000;
hdr.nbytesec=2*12000;
hdr.nbytesam2=2;
hdr.nbitsam2=16;
hdr.adata[0]='d';
hdr.adata[1]='a';
hdr.adata[2]='t';
hdr.adata[3]='a';
hdr.ndata=2*npts;
fwrite(&hdr,sizeof(hdr),1,fp);
// memcpy(jt9com_.d2,buf,2*npts);
// fwrite(buf,2,npts,fp);
fwrite(jt9com_.d2,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;
}