/// <summary> /// Multilevel 1-D Discreete Wavelet Transform /// </summary> /// <param name="signal">The signal. Example: new Signal(5, 6, 7, 8, 1, 2, 3, 4)</param> /// <param name="motherWavelet">The mother wavelet to be used. Example: CommonMotherWavelets.GetWaveletFromName("DB4")</param> /// <param name="level">The depth-level to perform the DWT</param> /// <param name="extensionMode">Signal extension mode</param> /// <param name="convolutionMode">Defines what convolution function should be used</param> /// <returns></returns> public static List <DecompositionLevel> ExecuteDWT(Signal signal, MotherWavelet motherWavelet, int level, SignalExtension.ExtensionMode extensionMode = SignalExtension.ExtensionMode.SymmetricHalfPoint, ConvolutionModeEnum convolutionMode = ConvolutionModeEnum.ManagedFFT) { var levels = new List <DecompositionLevel>(); var approximation = (double[])signal.Samples.Clone(); var details = (double[])signal.Samples.Clone(); var realLength = signal.Samples.Length; for (var i = 1; i <= level; i++) { var extensionSize = motherWavelet.Filters.DecompositionLowPassFilter.Length - 1; approximation = SignalExtension.Extend(approximation, extensionMode, extensionSize); details = SignalExtension.Extend(details, extensionMode, extensionSize); approximation = WaveMath.Convolve(convolutionMode, approximation, motherWavelet.Filters.DecompositionLowPassFilter); approximation = WaveMath.DownSample(approximation); details = WaveMath.Convolve(convolutionMode, details, motherWavelet.Filters.DecompositionHighPassFilter); details = WaveMath.DownSample(details); realLength = realLength / 2; levels.Add(new DecompositionLevel { Signal = signal, Index = i - 1, Approximation = approximation, Details = details }); details = (double[])approximation.Clone(); } return(levels); }
/// <summary> /// Executes the block /// </summary> public override void Execute() { var inputNode = InputNodes[0].ConnectingNode as BlockOutputNode; if (inputNode == null || inputNode.Object == null) { return; } OutputNodes[0].Object.Clear(); foreach (var inputSignal in inputNode.Object) { var ifft = (double[])inputSignal.Samples.Clone(); ManagedFFT.Instance.FFT(ref ifft, false, Mode); ifft = WaveMath.DownSample(ifft, 2, true); var signal = new Signal(ifft) { Start = 0, Finish = ifft.Length - 1, SamplingInterval = 1 }; OutputNodes[0].Object.Add(signal); } if (Cascade && OutputNodes[0].ConnectingNode != null) { OutputNodes[0].ConnectingNode.Root.Execute(); } }
public void TestDownsample() { var input = new double[] { 1, 2, 3, 4, 5, 6, 7, 8 }; var downSampled = WaveMath.DownSample(input); var expected = new double[] { 2, 4, 6, 8 }; Assert.IsTrue(downSampled.SequenceEqual(expected)); input = new double[] { 1, 2, 3 }; downSampled = WaveMath.DownSample(input); expected = new double[] { 2 }; Assert.IsTrue(downSampled.SequenceEqual(expected)); input = new double[] { 1 }; downSampled = WaveMath.DownSample(input); expected = new double[] { }; Assert.IsTrue(downSampled.SequenceEqual(expected)); }
/// <summary> /// Executes the block /// </summary> public override void Execute() { var inputNode = InputNodes[0].ConnectingNode as BlockOutputNode; if (inputNode == null || inputNode.Object == null) { return; } OutputNodes[0].Object.Clear(); foreach (var signal in inputNode.Object) { var output = signal.Copy(); output.Samples = WaveMath.DownSample(signal.Samples, Convert.ToInt32(Factor), true); OutputNodes[0].Object.Add(output); } if (Cascade && OutputNodes[0].ConnectingNode != null) { OutputNodes[0].ConnectingNode.Root.Execute(); } }