void WI_RecordingStopped(object sender, EventArgs e) { if (StopCalled) { return; } StopCalled = true; IR = new double[Channels_in][]; Direct_Sample = new int[Channels_in]; SNR = new double[Channels_in][]; for (int c = 0; c < Channels_in; c++) { double[] Recording = new double[Response[c].Count]; for (int n = 0; n < Response[c].Count; n++) { Recording[n] = (float)Response[c][n] / (float)Int16.MaxValue; } double[] DCR = Pach_SP.FFT_Deconvolution(Recording, TD_Signal); int length = (int)(SampleFreq * Signal_Length); IR[c] = new double[length]; for (int a = 0; a < CT_Averages; a++) { //int Choice = ; for (int s = 0; s < length; s++) { //if (s > IR.Length) IR[c][s] += DCR[(a + 1) * length + s]; } } for (int n = 0; n < length; n++) { IR[c][n] /= (double)CT_Averages; } double[] ETC = new double[IR[c].Length]; SNR[c] = new double[8]; for (int oct = 0; oct < 8; oct++) { double[] octIR = Pach_SP.FIR_Bandpass(IR[c], oct, SampleFreq, 0); for (int i = 0; i < IR[c].Length; i++) { ETC[i] = octIR[i] * octIR[i]; } Direct_Sample[c] = FindDirect(ETC); SNR[c][oct] = Signal_Noise_Ratio(ETC, Direct_Sample[c]); } } StopCalled = false; Running = false; }
private void RenderBtn_Click(object sender, System.EventArgs e) { if (Response == null || Response.Length == 0) { Rhino.RhinoApp.WriteLine("No impulse response found to render..."); return; } int SamplesPerSec; double[] SignalBuffer; OpenWaveFile(out SamplesPerSec, out SignalBuffer); float maxvalue = 0; //Normalize input signal... for (int j = 0; j < SignalBuffer.Length; j++) { maxvalue = (float)Math.Max(maxvalue, Math.Abs(SignalBuffer[j])); } for (int j = 0; j < SignalBuffer.Length; j++) { SignalBuffer[j] /= maxvalue; } //Convert pressure response to a 24-bit dynamic range: //double mod24 = Math.Pow(10, -50 / 10); //for (int i = 0; i < Response.Length; i++) for(int j = 0; j < Response[i].Length; j++) Response[i][j] *= mod24; float[][] NewSignal = new float[(int)Response.Length][]; for (int i = 0; i < Response.Length; i++) { NewSignal[i] = Pach_SP.FFT_Convolution(SignalBuffer, Response[i], 0); for (int j = 0; j < NewSignal[i].Length; j++) { NewSignal[i][j] *= 1E-5f; } } SrcRendered = new int[SourceList.CheckedIndices.Count]; for (int j = 0; j < SourceList.CheckedIndices.Count; j++) { SrcRendered[j] = SourceList.CheckedIndices[j]; } RecRendered = int.Parse(Receiver_Choice.Text); SFreq_Rendered = SamplesPerSec; SaveFileDialog SaveWave = new SaveFileDialog(); if (NewSignal.Length < 4) { SaveWave.Filter = " Wave Audio (*.wav) |*.wav"; } else { SaveWave.Filter = "Extended Wave Audio (*.wavex) |*.wavex"; } if (SaveWave.ShowDialog() == DialogResult.OK) { if (Response == null || Response.Length == 0) { Rhino.RhinoApp.WriteLine("No impulse response found to render..."); return; } NAudio.Wave.WaveFileWriter Writer = new NAudio.Wave.WaveFileWriter(SaveWave.FileName, new NAudio.Wave.WaveFormat(SamplesPerSec, 24, NewSignal.Length)); for (int j = 0; j < NewSignal[0].Length; j++) { for (int i = 0; i < Channel_View.Items.Count; i++) { Writer.WriteSample(NewSignal[i][j]); } } Writer.Close(); Writer.Dispose(); System.Media.SoundPlayer Player = new System.Media.SoundPlayer(SaveWave.FileName); Player.Play(); } }