#include #include #include #include #include #include "wavfile.h" #define MAX_CHARS 80 // adattata dalla dispensa void bandpass (short int *x, short int *y, int nsamp) { int i; int order = 2; double fc, bw, Q_1c, c, c_2, afc, abw; double a0,a1,a2,b0,b1=0,b2; double fs=44100.0L, pi=3.1415926535897932384626433832795L; printf("Frequenza di centro banda: "); scanf("%lf",&fc); printf("Larghezza di banda: "); scanf("%lf",&bw); afc = fs*tan((pi*fc)/fs)/pi; //pre-distorsione abw = (fs/pi)*(tan((pi*(fc+bw/2))/fs) - tan((pi*(fc-bw/2))/fs)); c = fs / (pi * afc); c_2 = c * c; Q_1c = c * abw / afc; // Q_1c = c * 1/Q a0 = 1 + Q_1c + c_2; a1 = 2*(c_2 - 1) / a0; a2 = (-1 + Q_1c - c_2) / a0; b0 = Q_1c / a0; b2 = -b0 / a0; y[0] = 0; //condizione iniziale y(-2) y[1] = 0; //condizione iniziale y(-1) for(i=order;i < nsamp; i++) y[i] = a1*y[i-1] + a2*y[i-2] + b0*x[i] + b2*x[i-2]; // b1 = 0 } int main () { char inputFile[MAX_CHARS]; char outputFile[MAX_CHARS]; short int *inBuffer; short int *outBuffer; struct WavHdr header; int campioni, campioniScritti; // Leggo da utente i file di input e output // TODO: meglio metterli come argv?? printf("Nome del file in ingresso: "); scanf("%s",inputFile); printf("Nome del file in uscita: "); scanf("%s",outputFile); campioni = readWaveFile (inputFile, &header, &inBuffer); if (campioni < 0) return 1; // Stampo le info sul file di ingresso printf ("\nFile di ingresso ----- %s -------\n\n", inputFile); printWaveInfo (header); // Alloco il buffer d'uscita outBuffer = (short int *) calloc (campioni, 2); // Applico il filtro bandpass bandpass (inBuffer, outBuffer, campioni); // Salvo il buffer d'uscita nel file specificato printf ("Salvo su %s... ",outputFile); campioniScritti = writeWaveFile (outputFile, &header, &outBuffer); free (inBuffer); free (outBuffer); if (campioniScritti != campioni) return 2; else { printf ("OK\n"); return 0; } }