Example #1
0
        /// <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);
        }
Example #2
0
        /// <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));
        }
Example #4
0
        /// <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();
            }
        }