/// <summary>Cuts out a section from the raw samples array.</summary> /// <param name="posXStart">The position in the rawSamples array to start the cut.</param> /// <param name="posXFinish">The position in the rawSamples array to end the cut.</param> private void cutRawSamples(int posXStart, int posXFinish) { //cut & save raw samples int length = (int)Math.Abs(posXFinish - posXStart); cutSamples = new double[length]; Array.Copy(rawSamples, posXStart, cutSamples, 0, length); //make new arr for raw samples minus the cut double[] newRawSamples = new double[rawSamples.Length - length]; //copy left side of cut into new arr Array.Copy(rawSamples, 0, newRawSamples, 0, posXStart); //copy right side of cut int arr Array.Copy(rawSamples, posXFinish, newRawSamples, posXStart, (rawSamples.Length - (posXStart + length))); //reinitialize rawsamples rawSamples = new double[newRawSamples.Length]; //copy new raw samples into old raw samples variable Array.Copy(newRawSamples, 0, rawSamples, 0, newRawSamples.Length); dataSize = rawSamples.Length / numChannels; DataFormats.Format myFormat = DataFormats.GetFormat("cutData"); ClipboardData cd = new ClipboardData(); cd.Sr = this.sampleRate; cd.Cs = cutSamples; DataObject myDataObject = new DataObject(myFormat.Name, cd); Clipboard.SetDataObject(myDataObject); refreshChart(); }
/// <summary>Downsamples sound data.</summary> /// <param name="csData">The sample data.</param> /// <returns>the new samples array after downsampling.</returns> private double[] downSample(ClipboardData csData) { ComplexNum[] nyquistFilter = genSampleFilter((int)this.sampleRate, csData); double[] nyquistFilterWeights = idft(nyquistFilter); double[] samples = filterSelect(nyquistFilterWeights, csData.Cs); int factor = (int)(csData.Sr / this.sampleRate); double[] newSamples = new double[csData.Cs.Length / factor]; for (int i = 0; i < newSamples.Length; ++i) { newSamples[i] = samples[i * factor]; } return(newSamples); }
/// <summary>Upsamples sound data.</summary> /// <param name="csData">The sample data.</param> /// <returns>the new samples array after upsampling.</returns> private double[] upSample(ClipboardData csData) { int factor = (int)(this.sampleRate / csData.Sr); double[] newSamples = new double[csData.Cs.Length * factor]; for (int i = 0; i < csData.Cs.Length; ++i) { for (int j = 0; j < factor; ++j) { newSamples[(i * factor) + j] = csData.Cs[i]; } } ComplexNum[] nyquistFilter = genSampleFilter((int)this.sampleRate, csData); double[] nyquistFilterWeights = idft(nyquistFilter); newSamples = filterSelect(nyquistFilterWeights, newSamples); return(newSamples); }
/// <summary>Copies a section of the raw samples.</summary> /// <param name="posXStart">The position in the rawSamples array to start the copy.</param> /// <param name="posXFinish">The position in the rawSamples array to end the copy.</param> private void copyRawSamples(int posXStart, int posXFinish) { //cut & save raw samples int length = (int)Math.Abs(posXFinish - posXStart); cutSamples = new double[length]; Array.Copy(rawSamples, posXStart, cutSamples, 0, length); DataFormats.Format myFormat = DataFormats.GetFormat("cutData"); ClipboardData cd = new ClipboardData(); cd.Sr = this.sampleRate; cd.Cs = cutSamples; DataObject myDataObject = new DataObject(myFormat.Name, cd); Clipboard.SetDataObject(myDataObject); }
/// <summary>Pastes rawSamples from the clipboard. If there are any.</summary> /// <param name="posX">The position to paste the samples in the rawSamples array.</param> private void pasteRawSamples(int posX) { DataFormats.Format myFormat = DataFormats.GetFormat("cutData"); IDataObject myRetrievedObject = Clipboard.GetDataObject(); ClipboardData csData = (ClipboardData)myRetrievedObject.GetData(myFormat.Name); if (csData != null) { if (csData.Cs == null || csData.Cs.Length <= 0 || csData.Sr <= 0) { return; } int length = csData.Cs.Length; double[] newCutSamples = csData.Cs; if (csData.Sr > this.sampleRate) { //downSample newCutSamples = downSample(csData); int factor = (int)(csData.Sr / this.sampleRate); length = csData.Cs.Length / factor; } if (csData.Sr < this.sampleRate) { //upSample newCutSamples = upSample(csData); int factor = (int)(this.sampleRate / csData.Sr); length = csData.Cs.Length * factor; } double[] newRawSamples = new double[rawSamples.Length + length]; //paste left side of cut into new arr Array.Copy(rawSamples, 0, newRawSamples, 0, posX); //paste cutout section Array.Copy(newCutSamples, 0, newRawSamples, posX + 1, newCutSamples.Length); //paste right side of cut int arr Array.Copy(rawSamples, posX, newRawSamples, (posX + length), rawSamples.Length - posX); //reinitialize rawsamples rawSamples = new double[newRawSamples.Length]; //copy new raw samples into old raw samples variable Array.Copy(newRawSamples, 0, rawSamples, 0, newRawSamples.Length); dataSize = rawSamples.Length / numChannels; refreshChart(); } }
/// <summary>Generates a filter to filter out aliases for upsampling/downsampling.</summary> /// <param name="newSampleRate">The new sample rate to determine the nyquist limit.</param> /// <param name="csData">The sample data.</param> /// <returns>ComplexNum array representing the filter.</returns> private ComplexNum[] genSampleFilter(int newSampleRate, ClipboardData csData) { ComplexNum[] filter = new ComplexNum[csData.Cs.Length / 10]; int freq = newSampleRate / 2; int bin = (freq * filter.Length) / newSampleRate; for (int i = 0; i < filter.Length; ++i) { filter[i] = new ComplexNum(); if (i <= bin) { filter[i].Re = 1.0; filter[i].Im = 1.0; } else { filter[i].Re = 0.0; filter[i].Im = 0.0; } } return(filter); }