Math.Net, 특히 FFT 부분을 실험하려고합니다. 순수한 사인파에서 주파수 도메인 정보를 추출하려고합니다. 당신이 볼 수 있듯이, 내가 20kHz의에서 샘플링 및 10K 샘플을 생성는 500Hz의 주파수에서 사인파를 생성하고순수 사인파의 창 데이터 세트에서 FFT를 올바르게 실행하는 방법
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;
}
: 여기에 코드입니다.
는 FFT는 (0Hz에서 약 1.8의 피크 잡담)이 전혀 없음을 보여준다! 나는 그것이 아마 windowing과의 오류라고 생각한다. 그러나 나 자신의 삶에 대해 그것이 무엇인지 나는 알 수 없다.
감사합니다.
이 복제하려고 할 때 Window.HannPeriodic 함수를 찾을 수 없습니다. MathNet 문서에 있지만 Window.Hann 만 사용하면 컴파일 할 수 있습니다. 내가 놓친 게 있니? –
@KelsonBall 3.14.0-beta3 버전입니다. –