- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I have been looking for a working example for the fourier transform using IPP in C#. Issue here is most of the example code here don’t work with the IPP version 9.0.
I wrote following code finally but unfortunately no data is assigned to the destination array. What might be the problem here?
And I have real signal and I create a complex signal to apply fft. Is it better to do fft directly using real signal?
Thanks!
using System.Runtime.InteropServices; using ipp; namespace IntelIPP_Test { unsafe public class Program { // Spec and working buffers static IppsFFTSpec_C_32fc* pFFTSpec; static byte[] pFFTSpecBuf, pFFTInitBuf, pFFTWorkBuf; // Allocate complex buffers static Ipp32fc[] pSrc, pDst; // Query to get buffer sizes static int _sizeFFTSpec, _sizeFFTInitBuf, _sizeFFTWorkBuf; //Set the size static int N = 128; static int order = (int)(Math.Log10((double)N) / Math.Log10(2.0)); static void Main(string[] args) { // Query to get buffer sizes int ippDivisionAlgorithm = 8; // (int)sp.IPP_FFT_DIV_INV_BY_N; IppHintAlgorithm ippPerformanceHint = IppHintAlgorithm.ippAlgHintAccurate; IppStatus result; fixed (int* sizeFFTSpec = &_sizeFFTSpec, sizeFFTInitBuf = &_sizeFFTInitBuf, sizeFFTWorkBuf = &_sizeFFTWorkBuf) { result = sp.ippsFFTGetSize_C_32fc(order, ippDivisionAlgorithm, ippPerformanceHint, sizeFFTSpec, sizeFFTInitBuf, sizeFFTWorkBuf); } // Alloc FFT buffers pFFTSpecBuf = new byte[_sizeFFTSpec]; pFFTInitBuf = new byte[_sizeFFTInitBuf]; pFFTWorkBuf = new byte[_sizeFFTWorkBuf]; // Initialize FFT fixed (byte* p_dftInitBuf = pFFTInitBuf) fixed (byte* p_dftSpecBuf = pFFTSpecBuf) { var p_dftSpec = (IppsFFTSpec_C_32fc*)pFFTSpec; result = sp.ippsFFTInit_C_32fc(&p_dftSpec, order, ippDivisionAlgorithm, ippPerformanceHint, p_dftSpecBuf, p_dftInitBuf); } getData(); // to assign data to pSrc fixed (Ipp32fc* pSource = pSrc, pssDst = pDst) fixed (byte* p_workBuffer = pFFTWorkBuf) fixed (byte* p_dftSpecBuf = pFFTSpecBuf) { var p_dftSpec = (IppsFFTSpec_C_32fc*)p_dftSpecBuf; // Fast Forward Fourier to spectra domain sp.ippsFFTFwd_CToC_32fc(pSource, pssDst, p_dftSpec, p_workBuffer); } }
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi L.Y.
You mentioned, most of the example code here don’t work with the IPP version 9.0. I recalled there is some C# sample in previous version, do you mean them?
I search them, include MKL C# sample, it seems no FFT sample,
https://software.intel.com/en-us/articles/using-intel-mkl-in-your-c-program
Could you attach the small test case, so I can debug directly?
Best Regards
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Ying,
Thanks for your response. Actually, I used "here" in context of Intel IPP forum. I have searched through forum using "c# fft" and "c# fourier" keywords and evaluated the codes found. For example:
https://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/306767
https://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/304898
https://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/309242
https://software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/309240
All examples use "ippsFFTInitAlloc_R_32f" for initialization. I have written finally following codes for the fft of real signal.
namespace IntelIPP_Test { unsafe public class program3 { static byte[] fFTSpecBuf, fFTInitBuf, fFTWorkBuf; // Query to get buffer sizes static int sizeFFTSpec, sizeFFTInitBuf, sizeFFTWorkBuf; static IppsFFTSpec_R_32f ppFFTSpec2 = new IppsFFTSpec_R_32f(); //Set the size static int N = 8; static int order = (int)(Math.Log10((double)N) / Math.Log10(2.0)); static float[] h = { 1.0f / 3, 1.0f / 3, 1.0f / 3, 0, 0, 0, 0, 0 }; static float[] x = new float[8]; static float[] X = new float[8]; static float[] H = new float[8]; public static void Main() { // initialize status IppStatus st; // Query to get buffer sizes int ippDivisionAlgorithm = 4; IppHintAlgorithm ippPerformanceHint = IppHintAlgorithm.ippAlgHintAccurate; // Query to get buffer sizes fixed (int* p_sizeFFTSpec = &sizeFFTSpec, p_sizeFFTInitBuf = &sizeFFTInitBuf, p_sizeFFTWorkBuf = &sizeFFTWorkBuf) { st = sp.ippsFFTGetSize_R_32f(N, ippDivisionAlgorithm, ippPerformanceHint, p_sizeFFTSpec, p_sizeFFTInitBuf, p_sizeFFTWorkBuf); } // Alloc FFT buffers fFTSpecBuf = new byte[sizeFFTSpec]; fFTInitBuf = new byte[sizeFFTInitBuf]; fFTWorkBuf = new byte[sizeFFTWorkBuf]; // Initialize FFT fixed(IppsFFTSpec_R_32f* ppFFTSpec = &ppFFTSpec2) fixed (byte* p_fftInitBuf = fFTInitBuf) fixed (byte* p_fftSpecBuf = fFTSpecBuf) { IppsFFTSpec_R_32f* _ppFFTSpec = (IppsFFTSpec_R_32f*)ppFFTSpec; st = sp.ippsFFTInit_R_32f(&_ppFFTSpec, N, ippDivisionAlgorithm, ippPerformanceHint, p_fftSpecBuf, p_fftInitBuf); } fixed(IppsFFTSpec_R_32f* pSpec3 = &ppFFTSpec2) fixed (byte* p_FFTWorkBuf = fFTWorkBuf) fixed (float* px = x, pX = X, ph = h, pH = H) { IppsFFTSpec_R_32f* _ppFFTSpec = (IppsFFTSpec_R_32f*)pSpec3; st = sp.ippsSet_32f(3.0f, px, 8); x[3] = 5.0f; st = sp.ippsFFTFwd_RToCCS_32f(px, pX, _ppFFTSpec, null); st = sp.ippsFFTFwd_RToPerm_32f(px, pX, _ppFFTSpec, null); st = sp.ippsFFTFwd_RToPack_32f(px, pX, _ppFFTSpec, null); //________________________ st = sp.ippsFFTFwd_RToCCS_32f(ph, pH, _ppFFTSpec, null); st = sp.ippsFFTFwd_RToPerm_32f(ph, pH, _ppFFTSpec, null); st = sp.ippsFFTFwd_RToPack_32f(ph, pH, _ppFFTSpec, null); //________________________ st = sp.ippsFFTFwd_RToPack_32f(ph, pH, _ppFFTSpec, null); st = sp.ippsMulPack_32f_I(pH, pX, 8); st = sp.ippsFFTInv_PackToR_32f(pX, px, _ppFFTSpec, null); } } }
At the end of the code, I would like to try different kind of conversions (ippsFFTFwd_RToCCS_32f, ippsFFTFwd_RToPerm_32f, ippsFFTFwd_RToPack_32f). However, I get following error as status for all cases: "ippStsContextMatchErr". I would be grateful if you can have a look at my code. And other issue is using of "ippsFree" which I couldn't find a way to make it work.
Thanks,
L.Y.

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page