using System; using System.Runtime.InteropServices; using VM.IPP; namespace VM.Mathematics.SignalProcessing { public unsafe class MedianFilterSampleCode { public static float[] MedianFilter(float[] input, int size) { if (input == null) throw new ArgumentNullException(); if (input.Length <= 0) throw new ArgumentException("Input array must have length longer than zero."); if (input.Length <= size) throw new ArgumentException("Input array must be longer then or equal to mask size."); if (size < 3) throw new ArgumentException("Size must be bigger then 3."); if (size % 2 == 0) throw new ArgumentException("Size must be odd."); // Allocate output float[] output = new float[input.Length]; // Find buffer size int bSize = 0; int errCode = 0; errCode = ippsFilterMedianGetBufferSize(size, IppDataType.ipp32f, &bSize); ErrorHandling.HandleReturnValue(errCode); byte[] buffer = new byte[bSize]; // Make delay line for input var delayLen = size - 1; float[] dlySrc = new float[delayLen]; for (int i = 0; i < delayLen; i++) { dlySrc[i] = input[i]; } // Make delay line for output float[] dlyDst = new float[delayLen]; for (int i = 0; i < delayLen; i++) { dlyDst[i] = input[input.Length - (delayLen - i)]; } // Do the actual filtering errCode = 0; fixed (float* pDlySrc = &dlySrc[0]) fixed (float* pDlyDst = &dlyDst[0]) fixed (float* pInput = &input[0]) fixed (float* pOutput = &output[0]) fixed (byte* pBuffer = &buffer[0]) { errCode = ippsFilterMedian_32f(pInput, pOutput, input.Length, size, pDlySrc, pDlyDst, pBuffer); } ErrorHandling.HandleReturnValue(errCode); return output; } [DllImport(IppDllNames.IPPSDLL, EntryPoint = "ippsFilterMedianGetBufferSize")] private static extern int ippsFilterMedianGetBufferSize(int maskSize, IppDataType dataType, int* pBufferSize); [DllImport(IppDllNames.IPPSDLL, EntryPoint = "ippsFilterMedian_32f")] private static extern int ippsFilterMedian_32f(float* pSrc, float* pDst, int len, int maskSize, float* pDlySrc, float* pDlyDst, byte* pBuffer); } }