static void ExampleUsePlanDirectly() { // Use the same arrays for as many transformations as you like. // If you can use the same arrays for your transformations, this is faster than calling DFT.FFT / DFT.IFFT using (var timeDomain = new FftwArrayComplex(253)) using (var frequencyDomain = new FftwArrayComplex(timeDomain.GetSize())) using (var fft = FftwPlanC2C.Create(timeDomain, frequencyDomain, DftDirection.Forwards)) using (var ifft = FftwPlanC2C.Create(frequencyDomain, timeDomain, DftDirection.Backwards)) { // Set the input after the plan was created as the input may be overwritten // during planning for (int i = 0; i < timeDomain.Length; i++) { timeDomain[i] = i % 10; } // timeDomain -> frequencyDomain fft.Execute(); for (int i = frequencyDomain.Length / 2; i < frequencyDomain.Length; i++) { frequencyDomain[i] = 0; } // frequencyDomain -> timeDomain ifft.Execute(); // Do as many forwards and backwards transformations here as you like } }
public static void SetupPlan(int numDpTime) { DFT.Wisdom.Import("wisdom.txt"); mTimeBuffer = new FftwArrayComplex(numDpTime); mFreqBuffer = new FftwArrayComplex(numDpTime); mPlanFore = FftwPlanC2C.Create(mTimeBuffer, mFreqBuffer, DftDirection.Forwards, PlannerFlags.Measure); mPlanBack = FftwPlanC2C.Create(mFreqBuffer, mTimeBuffer, DftDirection.Backwards, PlannerFlags.Measure); }
private static string ProcessMessage(string s, PinnedArray <double> pin, FftwArrayComplex com, FftwPlanRC fft) { //Deserialize and then FFTW then return datasample as json string WFOTransporter wav = JsonConvert.DeserializeObject <WFOTransporter>(s); WaveFileObject obj = new WaveFileObject(wav); DataSample sample = new DataSample(FFT(obj, pin, com, fft)); string json = JsonConvert.SerializeObject(sample); return(json); }
static double[] FFT(WaveFileObject obj, PinnedArray <double> pin, FftwArrayComplex com, FftwPlanRC fft) { Console.WriteLine("FFT"); double[] magnitudes; Console.WriteLine(obj.soundData.Count); double[] input = new double[obj.soundData.Count + 20286]; Array.Clear(input, 0, input.Length); obj.soundData.CopyTo(input, 0); switch (obj.header.channels) { case 1: for (int i = 0; i < pin.Length; i++) { pin[i] = input[i]; //Console.Write(pin[i] + " : "); } break; case 2: for (int i = 0; i < pin.Length; i++) { pin[i] = input[i + i]; //Console.WriteLine(pin[i]); } break; default: break; } fft.Execute(); magnitudes = new double[com.Length]; for (int i = 0; i < 4000; i++) { magnitudes[i] = 10 * Math.Log10((com[i].Magnitude / inputSize) * (com[i].Magnitude / inputSize)); /* * if (10 * Math.Log10((com[i].Magnitude / inputSize) * (com[i].Magnitude / inputSize)) > 10) * { * Console.WriteLine("Bin: " + i * sampleRate / com.Length + " " + 10 * Math.Log10((com[i].Magnitude / inputSize) * (com[i].Magnitude / inputSize))); * } */ } Console.WriteLine(com.Length); Console.WriteLine(); Console.WriteLine("Returning magnitudes"); return(magnitudes); }
static double calcFreqEnergy(FftwArrayComplex data, int rate) { // T a0^2 + T/2 Σcn^2 [n=1~N] // = T/2(2*a0^2 + Σcn^2) var len = data.Length; var T = len / rate; var energy = (data[0].Magnitude * data[0].Magnitude) * 2; //2*a0^2 for (int i = 1; i < len; i++) { energy += data[i].Magnitude * data[i].Magnitude; //Σcn^2 } energy *= T / 2.0; // T/2 return(energy); }
public AudioIn(int sampleRate, int device, int bufferSize) { if (device > WaveIn.DeviceCount) { throw new Exception(); } this.sampleRate = sampleRate; this.bufferSize = bufferSize; audioDataTrue = new short[bufferSize + 20286]; tempOdd = new double[audioDataTrue.Length]; tempTrue = new double[audioDataTrue.Length]; realIn = new PinnedArray <double>(audioDataTrue.Length); comOut = new FftwArrayComplex(DFT.GetComplexBufferSize(realIn.GetSize())); fft = FftwPlanRC.Create(realIn, comOut, DftDirection.Forwards); waveInDevices = WaveIn.DeviceCount; waveEvent = new WaveInEvent(); waveEvent.DeviceNumber = device; waveEvent.DataAvailable += OnWaveIn; channels = WaveIn.GetCapabilities(device).Channels; waveEvent.WaveFormat = new WaveFormat(sampleRate, 1); string path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "/NetworkSave01.json"; // Load Neural network if (File.Exists(path)) { Console.WriteLine("exists"); network = NeuralNetwork.LoadNetwork(path); } else { throw new FileNotFoundException(); } //network.PrintWeights(); waveEvent.StartRecording(); }
static void Main(string[] args) { try { TcpClient tcpClient = new TcpClient("127.0.0.1", 10000); Console.WriteLine("Connected"); StreamReader reader = new StreamReader(tcpClient.GetStream()); StreamWriter writer = new StreamWriter(tcpClient.GetStream()); string s = ""; using (var timeDomain = new PinnedArray <double>(inputSize)) using (var frequencyDomain = new FftwArrayComplex(DFT.GetComplexBufferSize(timeDomain.GetSize()))) using (var fft = FftwPlanRC.Create(timeDomain, frequencyDomain, DftDirection.Forwards)) { while (!(s = reader.ReadLine()).Equals("Quit") || (s == null)) { string result = ""; if (IsValidJson(s)) { result = ProcessMessage(s, timeDomain, frequencyDomain, fft); } writer.WriteLine(result); writer.Flush(); GC.Collect(); } reader.Close(); writer.Close(); tcpClient.Close(); } } catch (Exception e) { Console.WriteLine(e); Console.WriteLine(e.InnerException); Console.WriteLine(e.Message); throw; } }
static void ExampleR2C() { double[] input = new double[97]; var rand = new Random(); for (int i = 0; i < input.Length; i++) { input[i] = rand.NextDouble(); } using (var pinIn = new PinnedArray <double>(input)) using (var output = new FftwArrayComplex(DFT.GetComplexBufferSize(pinIn.GetSize()))) { DFT.FFT(pinIn, output); for (int i = 0; i < output.Length; i++) { Console.WriteLine(output[i]); } } }