Ejemplo n.º 1
0
                    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;
                    }
Ejemplo n.º 2
0
            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();
                }
            }