public static FilterProfile Profile(ISoundObj impulse, SmoothingType type, double resolution)
{
uint nSR = impulse.SampleRate;
uint nSR2 = nSR / 2;
ushort nChannels = impulse.NumChannels;
for (ushort c = 0; c < nChannels; c++)
{
// Read channel into a buffer
SingleChannel channel = impulse.Channel(c);
SoundBuffer buff = new SoundBuffer(channel);
buff.ReadAll();
// And then double in length to prevent wraparound
buff.PadTo(buff.Count * 2);
// Pad to next higher power of two
buff.PadToPowerOfTwo();
// Read out into array of complex
Complex[][] data = buff.ToComplexArray();
Complex[] cdata = data[0];
// Then we're done with the buffer for this channel
buff = null;
GC.Collect();
// FFT in place
Fourier.FFT(cdata.Length, cdata);
int n = cdata.Length / 2;
// Now we have an array of complex, from 0Hz to Nyquist and back again.
// We really only care about the first half of the cdata buffer, but
// treat it as circular anyway (i.e. wrap around for negative values).
//
// We're only working with magnitudes from here on,
// so we can save some space by computing mags right away and storing them in the
// real part of the complex array; then we can use the imaginary portion for the
// smoothed data.
for (int j = 0; j < cdata.Length; j++)
{
cdata[j].Re = cdata[j].Magnitude;
cdata[j].Im = 0;
}
// Take a rectangular window of width (resolution)*(octave or ERB band)
// Add up all magnitudes falling within this window
//
// Move the window forward by one thingummajig
//double wMid = 0; // center of the window
//double wLen = 0;
}
return(new FilterProfile()); // temp
}