17.01.2013 Views

musicdsp.org source code archive - WSInf

musicdsp.org source code archive - WSInf

musicdsp.org source code archive - WSInf

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

int i;<br />

double *h1 = new double[N];<br />

double *h2 = new double[N];<br />

// 1. Generate lowpass filter at first (low) cutoff frequency<br />

wsfirLP(h1, N, WINDOW, fc1);<br />

// 2. Generate highpass filter at second (high) cutoff frequency<br />

wsfirHP(h2, N, WINDOW, fc2);<br />

// 3. Add the 2 filters together<br />

for (i = 0; i < N; i++) {<br />

h[i] = h1[i] + h2[i];<br />

}<br />

// Delete dynamic memory<br />

delete []h1;<br />

delete []h2;<br />

return;<br />

}<br />

// Generate bandpass filter<br />

//<br />

// This is done by generating a bandstop filter and spectrally inverting it<br />

void wsfirBP(double h[],// h[] will be written with the filter taps<br />

const int &N,// size of the filter<br />

const int &WINDOW,// window function (W_BLACKMAN, W_HANNING, etc.)<br />

const double &fc1,// low cutoff frequency<br />

const double &fc2)// high cutoff frequency<br />

{<br />

int i;<br />

// 1. Generate bandstop filter<br />

wsfirBS(h, N, WINDOW, fc1, fc2);<br />

// 2. Spectrally invert bandstop (negate all, and add 1 to center sample)<br />

for (i = 0; i < N; i++) {<br />

h[i] *= -1.0;// = 0 - h[i]<br />

}<br />

h[(N-1)/2] += 1.0;// = 1 - h[(N-1)/2]<br />

return;<br />

}<br />

// Generate sinc function - used for making lowpass filter<br />

void genSinc(double sinc[],// sinc[] will be written with the sinc function<br />

const int &N,// size (number of taps)<br />

const double &fc)// cutoff frequency<br />

{<br />

int i;<br />

const double M = N-1;<br />

double n;<br />

// Constants<br />

const double PI = 3.14159265358979323846;<br />

// Generate sinc delayed by (N-1)/2<br />

for (i = 0; i < N; i++) {<br />

if (i == M/2.0) {<br />

sinc[i] = 2.0 * fc;<br />

}<br />

else {<br />

n = (double)i - M/2.0;<br />

sinc[i] = sin(2.0*PI*fc*n) / (PI*n);<br />

}<br />

}<br />

return;<br />

}<br />

// Generate window function (Blackman)<br />

void wBlackman(double w[],// w[] will be written with the Blackman window<br />

const int &N)// size of the window<br />

{<br />

int i;<br />

const double M = N-1;<br />

const double PI = 3.14159265358979323846;<br />

for (i = 0; i < N; i++) {<br />

w[i] = 0.42 - (0.5 * cos(2.0*PI*(double)i/M)) + (0.08*cos(4.0*PI*(double)i/M));<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!