J'essaie d'expérimenter avec Math.Net, en particulier la partie FFT. J'essaye d'extraire l'information de domaine de fréquence d'une onde sinusoïdale pure. Voici le code:Comment exécuter correctement une FFT sur un ensemble de données fenêtrées à partir d'une onde sinusoïdale pure
private void Form1_Load(object sender, EventArgs e)
{
//Set up the wave and derive some useful info
Double WaveFreq = 500;
Double WavePeriod = 1/WaveFreq;
Double SampleFreq = 20000;
Double SampleTime = (1/SampleFreq);
//Generate the wave using the above parameters
var points = Generate.Sinusoidal(100000, SampleFreq, WaveFreq, 1);
//Array to hold our complex numbers
var data = new Complex[points.Length];
//Set up the series to display our raw wave
Series WaveSeries = new Series("Waveform");
WaveSeries.ChartType = SeriesChartType.Line;
//Creat the series for displaying the FFT
Series FFTSeries = new Series("FFT Test");
FFTSeries.ChartType = SeriesChartType.Column;
//Populate both the wave series and the data array
for (int i = 0; i < points.Length; i++)
{
Double x = SampleTime * i;
WaveSeries.Points.AddXY(x, points[i]);
data[i] = new Complex(x, points[i]);
}
//Create the window to evaluate (using a window 5 times wider than the wavelength of the lowest ferequency being measured)
int WindowWidth = (int)Math.Round((1/WaveFreq)/(1/SampleFreq) * 5 + 0.5f);
var HannWindow = Window.HannPeriodic(WindowWidth);
var window = new Complex[WindowWidth];
for(int i = 0; i < WindowWidth; i++)
{
var y = data[i].Imaginary * HannWindow[i];
window[i] = new Complex(data[i].Real, y);
}
//Perform the FFT
Fourier.Forward(window);
//Add the calculated FFT to our FFTSeries
foreach(Complex sample in window)
{
FFTSeries.Points.AddXY(sample.Phase, sample.Magnitude);
}
chart2.Series.Add(WaveSeries);
chart2.ChartAreas[0].AxisX.Minimum = 0;
chart2.ChartAreas[0].AxisX.Maximum = .01;
chart2.ChartAreas[0].AxisY.Minimum = -2;
chart2.ChartAreas[0].AxisY.Maximum = 2;
chart1.Series.Add(FFTSeries);
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = 1000;
chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = 5;
}
Comme vous pouvez le voir, je générer une onde sinusoïdale à une fréquence de 500 Hz, l'échantillonnage à 20 kHz et générer 10k échantillons.
La sortie est comme suit (FFT à gauche, vague à droite)
La FFT montre absolument rien (apartés d'un sommet de 1,8 autour de 0 Hz)! Je soupçonne que c'est probablement une erreur avec le fenêtrage mais pour la vie de moi je ne peux pas voir ce que c'est.
J'apprécie toute aide!
Lorsque j'essaie de répliquer cela, je ne trouve pas la fonction Window.HannPeriodic. C'est dans la documentation MathNet, mais je ne peux compiler que si je passe à simplement utiliser Window.Hann. Est-ce que je manque quelque chose? –
@KelsonBall Il est dans la version 3.14.0-beta3. –