private double CalculateCableForce(VibrateChannel channel, double frequency) { double result = 0; result = 4 * channel.Mass * channel.Length * channel.Length * frequency * frequency; return(result); }
private void LoadChannels() { using (SQLiteConnection connection = new SQLiteConnection(this.database)) { connection.Open(); string strainStatement = "select SensorId,ChannelNo from Channels where GroupNo ='" + this.deviceId + "'"; SQLiteCommand command = new SQLiteCommand(strainStatement, connection); using (SQLiteDataReader reader = command.ExecuteReader()) { while (reader.Read()) { //string groupId = reader.GetString(0); string sensorId = reader.GetString(0); int channelNo = reader.GetInt32(1); VibrateChannel vc = new VibrateChannel(sensorId, channelNo, 0, 0); vibrateChannels.Add(channelNo, vc); } } } }
/// <summary> /// This method will be called whenever there is a new audio /// frame to be processed. /// </summary> /// void ProcessFrame(float[,] channels, string stamp) { // We can start by converting the audio frame to a complex signal //Signal realSignal = Signal.FromArray(channels,WindowSize,8, 50, SampleFormat.Format32BitIeeeFloat); //ComplexSignal signal = ComplexSignal.FromSignal(realSignal); ComplexSignal signal = ComplexSignal.FromArray(channels, 50); // If its needed, if (window != null) { // Apply the chosen audio window signal = window.Apply(signal, 0); } // Transform to the complex domain signal.ForwardFourierTransform(); // Now we can get the power spectrum output and its // related frequency vector to plot our spectrometer. double[] freqv = Tools.GetFrequencyVector(signal.Length, signal.SampleRate); double[][] power = new double[signal.Channels][]; //Complex[] channel = signal.GetChannel(0); //double[] g = Tools.GetPowerSpectrum(channel); int[][] peaksIndex1 = new int[signal.Channels][]; int[][] peaksIndex2 = new int[signal.Channels][]; int SearchLength = 7; string content = stamp + ","; for (int i = 0; i < signal.Channels; i++) { //complexChannels[i] = signal.GetChannel(i); power[i] = Tools.GetPowerSpectrum(signal.GetChannel(i)); // zero DC power[i][0] = 0; double max = power[i].Max(); int position = Array.IndexOf(power[i], max); //normalize amplitude for (int n = 0; n < power[i].Length; n++) { power[i][n] = power[i][n] / max; } if (vibrateChannels.ContainsKey(i + 1)) { VibrateChannel vc = vibrateChannels[i + 1]; float[] floatList = power[i].Select(x => (float)x).ToArray(); AccWave awObject = new AccWave(vc.SensorId, "028", floatList); //byte[] result = serializer.PackSingleObject(awObject); //AppendLog(this.ip + " Frame Length: " + result.Length.ToString()); //udpClient.Send(result, result.Length, remoteEndPoint); //udpClient.Close(); } //if (!isCalculateCableForce) //{ // continue; //} double maxFrequency = freqv[position]; peaksIndex1[i] = power[i].FindPeaks(); if (peaksIndex1[i].Length < SearchLength) { continue; } double[] peaks2 = new double[peaksIndex1[i].Length]; for (int j = 0; j < peaksIndex1[i].Length; j++) { peaks2[j] = power[i][peaksIndex1[i][j]]; //low pass //if (freqv[peaksIndex1[i][j]] > 10) //{ // peaks2[j] = 0; //} } peaksIndex2[i] = MaxSort(SearchLength, peaks2); Array.Sort(peaksIndex2[i]); } udpClient.Close(); if (isUpdateChart) { if (chart1.InvokeRequired) { chart1.BeginInvoke(new MethodInvoker(() => { for (int j = 0; j < signal.Channels; j++) { chart1.Series[j + 16].Points.Clear(); for (int i = 0; i < freqv.Length; i++) { chart1.Series[j + 16].Points.AddXY(freqv[i], power[j][i]); } if (isCalculateCableForce) { for (int k = 0; k < peaksIndex2[j].Length; k++) { chart1.Series[j + 16].Points[peaksIndex1[j][peaksIndex2[j][k]]].Label = freqv[peaksIndex1[j][peaksIndex2[j][k]]].ToString(); } } } chart1.Invalidate(); })); } else { for (int j = 0; j < signal.Channels; j++) { chart1.Series[j + 16].Points.Clear(); for (int i = 0; i < freqv.Length; i++) { chart1.Series[j + 16].Points.AddXY(freqv[i], power[j][i]); } } chart1.Invalidate(); } } }
/// <summary> /// This method will be called whenever there is a new audio /// frame to be processed. /// </summary> /// void ProcessFrame(float[,] channels, string stamp) { // We can start by converting the audio frame to a complex signal //Signal realSignal = Signal.FromArray(channels,WindowSize,8, 50, SampleFormat.Format32BitIeeeFloat); //ComplexSignal signal = ComplexSignal.FromSignal(realSignal); ComplexSignal signal = ComplexSignal.FromArray(channels, 50); //AppendLog(this.ip + "ProcessFrame Start "); // If its needed, if (window != null) { // Apply the chosen audio window signal = window.Apply(signal, 0); } // Transform to the complex domain signal.ForwardFourierTransform(); // Now we can get the power spectrum output and its // related frequency vector to plot our spectrometer. double[] freqv = Tools.GetFrequencyVector(signal.Length, signal.SampleRate); double[][] power = new double[signal.Channels][]; //Complex[] channel = signal.GetChannel(0); //double[] g = Tools.GetPowerSpectrum(channel); int[][] peaksIndex1 = new int[signal.Channels][]; int[][] peaksIndex2 = new int[signal.Channels][]; int SearchLength = 7; string content = stamp + ","; //IPAddress remoteIp = IPAddress.Parse(this.spectrumIP); ////int port = int.Parse(this.spectrumPort); //IPEndPoint remoteEndPoint = new IPEndPoint(remoteIp, this.spectrumPort); //UdpClient udpClient = new UdpClient(); //Dictionary<RedisKey, RedisValue> pair = new Dictionary<RedisKey, RedisValue>(); //IDatabase db_result = this.redis.GetDatabase(5); for (int i = 0; i < signal.Channels; i++) { //AppendLog(this.ip + "ProcessFrame calculate frame"); //complexChannels[i] = signal.GetChannel(i); power[i] = Tools.GetPowerSpectrum(signal.GetChannel(i)); // zero DC power[i][0] = 0; //test log //for (int n = 0; n < power[i].Length; n++) //{ // power[i][n] = Math.Log10(power[i][n]+0.0000000001); //} double max = power[i].Max(); int position = Array.IndexOf(power[i], max); //normalize amplitude for (int n = 0; n < power[i].Length; n++) { power[i][n] = power[i][n] / max; } if (vibrateChannels.ContainsKey(i + 1)) { //AppendLog(this.ip + "ProcessFrame Send Spectrum"); VibrateChannel vc = vibrateChannels[i + 1]; float[] floatList = power[i].Select(x => (float)x).ToArray(); //AccWave awObject = new AccWave(vc.SensorId, "028", floatList); //byte[] result = serializer.PackSingleObject(awObject); //AppendLog(this.ip + " Frame Length: " + result.Length.ToString()); //udpClient.Send(result, result.Length, remoteEndPoint); //udpClient.Close(); } //if (!isCalculateCableForce) //{ // continue; //} double maxFrequency = freqv[position]; peaksIndex1[i] = power[i].FindPeaks(); if (peaksIndex1[i].Length < SearchLength) { continue; } double[] peaks2 = new double[peaksIndex1[i].Length]; for (int j = 0; j < peaksIndex1[i].Length; j++) { peaks2[j] = power[i][peaksIndex1[i][j]]; //low pass //if (freqv[peaksIndex1[i][j]] > 10) //{ // peaks2[j] = 0; //} } peaksIndex2[i] = MaxSort(SearchLength, peaks2); Array.Sort(peaksIndex2[i]); double[] frequencies = new double[SearchLength]; try { for (int k = 0; k < SearchLength; k++) { frequencies[k] = freqv[peaksIndex1[i][peaksIndex2[i][k]]]; } } catch (Exception ex) { } double frequency = 0; double frequency1 = FindFFWithFundamentalFreqency(frequencies, maxFrequency); List <double> candidateFrequencies = SearchCandidateFrequencyWithSpacing(frequencies, frequencies.Length, 0.3); double frequency2 = FindFFWithSpacing(frequency1, candidateFrequencies.ToArray()); if (Math.Abs(frequency1 - frequency2) < 0.15) { frequency = (frequency2 + frequency1) / 2; } content += frequency.ToString(); content += ","; //AppendLog("Channel " + (i + 1).ToString() + " "); //if ((i + 1) == (int)numericUpDownChannel.Value) //{ // //AppendLog("Channel " + (i + 1).ToString() + " f1: " + frequency1.ToString() + " f2: " + frequency2.ToString() + " Fundamental frequency:" + frequency.ToString()); // if (frequency != 0) // { // //string stamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // string str = ""; // str += stamp + " "; // if (redis.IsConnected) // { // } // else // { // str += "redis server is not connected"; // //lthis.AppendLog(str); // return; // } // if (vibrateChannels.ContainsKey(i + 1)) // { // double force = 0; // VibrateChannel vc = vibrateChannels[i+1]; // force = Math.Round(CalculateCableForce(vc, frequency) / 1000); // string key = vc.SensorId + "-012"; // DataValue dv = new DataValue(); // dv.SensorId = vc.SensorId; // dv.TimeStamp = stamp; // dv.ValueType = "012"; // dv.Value = frequency; // //resultQueue.Enqueue(dv); // string result = JsonConvert.SerializeObject(dv); // pair[key] = result; // if (force != 0) // { // key = vc.SensorId + "-013"; // DataValue dv1 = new DataValue(); // dv1.SensorId = vc.SensorId; // dv1.TimeStamp = stamp; // dv1.ValueType = "013"; // dv1.Value = force; // string result1 = JsonConvert.SerializeObject(dv1); // pair[key] = result; // //resultQueue.Enqueue(dv1); // } // AppendLog("Channel " + (i + 1).ToString() + " frequency: " + frequency.ToString() + " Cable Force: " + force.ToString()); // } // } //} } //if (pair.Count > 0) //{ // db_result.StringSet(pair.ToArray()); // pair.Clear(); //} //content = content.Remove(content.Length - 1); //udpClient.Close(); //AppendResult(content); //return; if (isUpdateChart) { if (chart1.InvokeRequired) { chart1.BeginInvoke(new MethodInvoker(() => { for (int j = 0; j < signal.Channels; j++) { chart1.Series[j + 16].Points.Clear(); for (int i = 0; i < freqv.Length; i++) { chart1.Series[j + 16].Points.AddXY(freqv[i], power[j][i]); } if (peaksIndex2[j] == null) { continue; } for (int k = 0; k < peaksIndex2[j].Length; k++) { chart1.Series[j + 16].Points[peaksIndex1[j][peaksIndex2[j][k]]].Label = freqv[peaksIndex1[j][peaksIndex2[j][k]]].ToString(); } } chart1.Invalidate(); })); } else { for (int j = 0; j < signal.Channels; j++) { chart1.Series[j + 16].Points.Clear(); for (int i = 0; i < freqv.Length; i++) { chart1.Series[j + 16].Points.AddXY(freqv[i], power[j][i]); } } chart1.Invalidate(); } } //AppendLog(this.ip+" ProcessFrame Finish "); }