I take blocks of incoming data and pass them through fftw to get some spectral information. Everything seems to be working, however I think I'm getting some aliasing issues.
I've been trying to work out how to implement a hann window on my blocks of data. Google has failed me for examples. Any ideas or links I should be looking at?
double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048]
Update
Thanks to Oli for pointing out the issue I'm actually trying to fix is spectral-leakage, NOT aliasing...
Wikipedia is your friend: Hanning window
Surely your googling came up with wikipedia?! Anyway just create a function that returns an array of length N with the Hanning coefficients and multiply this array by your
dataIn[2048]
.http://en.wikipedia.org/wiki/Hann_function . The implementation follows from the definition quite straightforwardly. Just use the
w(n)
function as multiplier, loop through all your samples (changingn
as you go), and that's it.Not an answer to your question, but an aside on your problem. Windowing helps solve spectral leakage problems, not aliasing problems.
Spectral-leakage effects occur when the frequency components of your waveform are not exact integer sub-multiples of your sample rate.
If you have aliasing, then you're fundamentally screwed. You'll either need to increase your sample rate, or put in a (better) anti-aliasing filter before you sample.
The complete function that is equivalent to MATLAB's
hanning.m
can be found here:Why not use Math.NET's Hann windowing implementation?
Located here: https://numerics.mathdotnet.com/api/MathNet.Numerics/Window.htm
This is fine but most people probably want to do this on thousands of arrays full of data. You can fill an array of just constant multipliers once as your program's initializing (use the same size array you feed to FFT) then just multiply each point in your real array by each point in the multiplier array. Faster/cheaper than taking all those cosines over again each time.