Code:
/* Function reads file with signal sent by transmiter */
int ReadFFTInputFile(FILE *fft_input, double xr[]) {
double buffer;
int i = 0;
int state;
/* Reading of file lasts until buffer is not full and
end of file is not reached */
while(i < FFTN && !feof(fft_input)) {
fread(buffer,sizeof(double),1,fft_input);
xr[i++] = buffer;
}
/* If the end of the file has been reached number of
read coeficients will be less than size of the buffer,
the unwritten buffer is filled with zeros */
if (i < FFTN) {
for (int j = i; j < FFTN; j++) {
xr[j] = 0;
}
state = 1;
}
else state = 0;
/* state indicates if the end of file has been reached */
return state;
}
Ova funkcija ti iscitava po 256 odmeraka signala iz PCM datoteke i ubacuje ih u niz (ja sam izbacio neke stvari iz ove funkcije koje ti nisu potrebne, i izmenio neke delove da bi pojasnio princip rada sa pcm datotekama, pa ne garantujem da ce ovo proci kompajliranje iz prve

).
Code:
void Receiver(double Y[], double xr[], double xi[], double Wre[], double Wim[]) {
double Yre[FFTN];
double Yim[FFTN];
FILE *fft_input;
int Levels;
int j, ind;
int status;
char rec_signal;
int K,w;
if( (fft_input = fopen( "test.pcm", "r" )) == NULL ) {
printf( "The file 'test.pcm' was not opened\n" );
getch();
return;
}
ReadCosFile();
ReadSinFile();
printf("\n Prepoznati signali: \n\n");
while (status != 1) {
status = ReadFFTInputFile(fft_input, xr);
/* number of levels for FFT */
Levels = log(FFTN)/log(2);
/* reset imaginary coeficients to zero */
for(int i = 0; i < FFTN; i++) {
xi[i] = 0;
xi_dsp[i] = 0;
}
/* implementation of FFT DIF algorithm */
for (i = 0; i < Levels; i++) {
j = -1;
K = (int)(FFTN/(2*pow(2,i)));
for (int k = 0; k < FFTN/2; k++) {
if (k%K == 0) j++;
w = (int)(k%K)*pow(2,i);
ind = k+j*K;
/* upper butterfly wing */
Yre[ind] = xr[ind] + xr[ind+K];
Yim[ind] = xi[ind] + xi[ind+K];
/* lower butterfly wing */
Yre[ind+K] = (xr[ind] - xr[ind+K])*cos_table[w]
- (xi[ind] - xi[ind+K])*sin_table[w];
Yim[ind+K] = (xi[ind] - xi[ind+K])*cos_table[w]
+ (xr[ind] - xr[ind+K])*sin_table[w];
}
/* input for next level of FFT is an output of
current level */
for (k = 0; k < FFTN; k++) {
xr[k] = Yre[k];
xi[k] = Yim[k];
}
}
/* reversion of bits for output signals */
BitReverse(Yre, Levels);
BitReverse(Yim, Levels);
for (int k = 0; k < FFTN; k++) {
Y[k] = pow(Yre[k],2) + pow(Yim[k],2);
}
rec_signal = Decider(Y);
if (rec_signal != ' ') printf("%c ", rec_signal);
}
fclose(fft_input);
}
Ova funkcija uzima 256 odmeraka signala iz pcm datoteke i nad njima izvrsi Fourierovu transformaciju, zatim se izvrsi reverzija bita (standardan postupak kod FFT-a

) i pozove funkcija za prepoznavanje signala.
Code:
/* Function performes recognition of received signal */
char Decider(double Y[]) {
char result;
int tmp_l = 4, tmp_h = 4;
for (int i = 0; i < FFTN-1; i++) {
if (Y[i] > TRASHHOLD)
for (int j = 0; j < 4; j++) {
/* if energy of received signal is greater than TRASHHOLD,
it's being compared with desired energies */
if (i == ToneCodes[0][j]) tmp_l = j;
if (i == ToneCodes[1][j]) tmp_h = j;
}
}
/* signal is recognized as a silence */
if (tmp_l == 4 || tmp_h == 4) result = ' ';
else result = Digits[tmp_l][tmp_h];
return result;
}
E ovo je najbitniji deo, kad se izvrsi FFT, pozoves funkciju za prepoznavanje signala koja prolazi kroz tacke FFT-a (ukupno njih 256) i poredi energiju signala sa pragom. Kada dobijes tacku u kojoj je energija veca od praga to znaci da si dobio frekvenciju signala, koju izracunas preko jedne mat. formule koju ja trenutno ne mogu da nadjem

, ali tu je negde naci cu je vec.