123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- using FxpConvert.Common;
- using System;
- using System.Collections.Generic;
- using System.Runtime.CompilerServices;
- using System.Runtime.InteropServices;
- using System.Text;
- namespace BaseCpuFxpConvert
- {
- public sealed class CpuCalc : ICalc
- {
- public IAdd Add { get; } = new CpuAdd();
- public ISubtract Subtract { get; } = new CpuSubtract();
- public IMultiply Multiply { get; } = new CpuMultiply();
- public IDivision Division { get; } = new CpuDivision();
- public IFFT FFT { get; } = new CpuFFT();
- public IArraySum Sum { get; } = new CpuArraySum();
- public unsafe void Fill(ref float result, float value, uint count)
- {
- if (count == 0) return;
- if(value ==0)
- {
- Unsafe.InitBlock(ref Unsafe.As<float, byte>(ref result), 0, count * 4);
- return;
- }
- Span<float> temp = new Span<float>(Unsafe.AsPointer(ref result),(int)count);
- temp.Fill(value);
- }
- }
- public sealed class CpuArraySum : IArraySum
- {
- public unsafe float Rms(ref float value, uint count)
- {
- if (count == 0) return 0;
- if (count == 1) return value;
- float temp = value*value;
- float* ptr = (float*)Unsafe.AsPointer(ref value);
- for(int i=1;i<count;i++)
- {
- temp += (ptr[i] * ptr[i]);
- }
- return MathF.Sqrt(temp / count);
- }
- public unsafe double Rms(ref double value, uint count)
- {
- if (count == 0) return 0;
- if (count == 1) return value;
- double temp = value * value;
- double* ptr = (double*)Unsafe.AsPointer(ref value);
- for (int i = 1; i < count; i++)
- {
- temp += (ptr[i] * ptr[i]);
- }
- return Math.Sqrt(temp / count);
- }
- public unsafe float Sum(ref float value, uint count)
- {
- if (count == 0) return 0;
- if (count == 1) return value;
- float* ptr = (float*)Unsafe.AsPointer(ref value);
- float temp = value;
- for(int i=1;i<count;i++)
- {
- temp += ptr[i];
- }
- return temp;
- }
- public unsafe double Sum(ref double value,uint count)
- {
- if (count == 0) return 0;
- if(count ==1)return value;
- double* ptr = (double*)Unsafe.AsPointer(ref value);
- double temp = value;
- for(int i=1;i<count;i++)
- {
- temp += ptr[i];
- }
- return temp;
- }
- }
- public sealed class CpuFFT:IFFT
- {
- public void FFT(double[] real, double[] imaginary)
- {
- MathNet.Numerics.IntegralTransforms.Fourier.Forward(real, imaginary, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
- }
- public void FFT(float[] real, float[] imaginary)
- {
- MathNet.Numerics.IntegralTransforms.Fourier.Forward(real, imaginary, MathNet.Numerics.IntegralTransforms.FourierOptions.Matlab);
- }
- }
- public sealed class CpuSubtract : ISubtract
- {
- public void Subtract(ref float left, float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) - right;
- }
- }
- public void Subtract(ref float left, ref float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) - Unsafe.Add(ref right, i);
- }
- }
- public void Subtract(ref float left, float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp -= right;
- }
- }
- public void Subtract(ref float left, ref float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp -= Unsafe.Add(ref right, i);
- }
- }
- }
- public sealed class CpuAdd:IAdd
- {
- public void Add(ref float left, float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) + right;
- }
- }
- public void Add(ref float left, ref float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) + Unsafe.Add(ref right, i);
- }
- }
- public void Add(ref float left, float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp += right;
- }
- }
- public void Add(ref float left, ref float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp += Unsafe.Add(ref right, i);
- }
- }
- }
- public sealed class CpuMultiply : IMultiply
- {
- public void Multiply(ref float left, float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) * right;
- }
- }
- public void Multiply(ref float left, ref float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) * Unsafe.Add(ref right, i);
- }
- }
- public void Multiply(ref float left, float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp *= right;
- }
- }
- public void Multiply(ref float left, ref float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp *= Unsafe.Add(ref right, i);
- }
- }
- }
- public sealed class CpuDivision : IDivision
- {
- public void Division(ref float left, float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) / right;
- }
- }
- public void Division(ref float left, ref float right, uint count, ref float result)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref result, i);
- temp = Unsafe.Add(ref left, i) / Unsafe.Add(ref right, i);
- }
- }
- public void Division(ref float left, float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp /= right;
- }
- }
- public void Division(ref float left, ref float right, uint count)
- {
- if (count == 0) return;
- for (int i = 0; i < count; i++)
- {
- ref float temp = ref Unsafe.Add(ref left, i);
- temp /= Unsafe.Add(ref right, i);
- }
- }
- }
- }
|