Неправильное преобразование при использовании библиотеки FFTW - C#
Формулировка задачи:
Мне надо использовать библиотеку FFTW. Сайт с примером. Я написал код, основанный на примере с сайта. Мне надо с помощью БПФ получить АЧХ синусоидального сигнала. Входные данные - комплексные значения. Поэтому используется массивы float[] fin, fout;
в которых fin[i*2] - действительное число, fin[i * 2 + 1] - мнимое число. Но как я понял т.к. у меня синусоидальный сигнал то мнимая часть должна быть равна нулю, т.е. fin[i * 2 + 1] = 0
Я написал следующий код:
Выходной массив fout. Но в этом массиве получаются какие то огромные значения, при возведении которых в квадрат получается бесконечность. Где может быть ошибка?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using fftwlib; namespace fure { public class fftwtest { //pointers to unmanaged arrays IntPtr pin, pout; //managed arrays double[] fin, fout; //pointers to the FFTW plan objects public IntPtr fplan1, fplan2; // Initializes FFTW and all arrays // n: Logical size of the transform public void InitFFTW(int n) { //create two unmanaged arrays, properly aligned pin = fftwf.malloc(n * 8); pout = fftwf.malloc(n * 8); //create two managed arrays, possibly misalinged //n*2 because we are dealing with complex numbers fin = new double[n*2]; fout = new double[n*2]; double T = 0.0000159;//длительность сигнала double F = 345000; //частота сигнала double F_d = 6250000;//частота дискретизации n = (int)(T * F_d); //fill our arrays with a sawtooth signal for (int i = 0; i < n; i++) { fin[i*2] = 5 * Math.Sin(2 * Math.PI * F * i/F_d); fin[i * 2 + 1] = 0; } //copy managed arrays to unmanaged arrays Marshal.Copy(fin, 0, pin, n*2 ); //create a few test transforms fplan1 = fftwf.dft_1d(n, pin, pout, fftw_direction.Forward, fftw_flags.Estimate); } // Tests a single plan, displaying results //plan: Pointer to plan to test public void TestPlan(IntPtr plan, int n) { fftwf.execute(plan); Marshal.Copy(pout, fout, 0, n * 2); Console.WriteLine(fout[30]); } // Releases all memory used by FFTW/C# public void FreeFFTW() { //it is essential that you call these after finishing //may want to put the initializers in the constructor //and these in the destructor fftwf.free(pin); fftwf.free(pout); fftwf.destroy_plan(fplan1); } } class Program { static void Main(string[] args) { double T = 0.0000159;//длительность сигнала double F_d = 6250000;//частота дискретизации int n = (int)(T * F_d); fftwtest test = new fftwtest(); test.InitFFTW(n); test.TestPlan(test.fplan1, n); Console.ReadLine(); } } }
Решение задачи: «Неправильное преобразование при использовании библиотеки FFTW»
textual
Листинг программы
f[i] = i*fd /n; // f[i] – значения, откладываемые по оси асцисс, fd – частота дискретизации, n – число точек АЧХ (включает и зеркальное отражение), i – номер отсчета
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д