예제 #1
0
        static void Main(string[] args)
        {
            DWT dwt = new DWT("Boat.png");

            //DWT dwt = new DWT("Lenna.jpg");
            dwt.threshold = 0.5;
            dwt.Processing();
            dwt.SaveImage();
            dwt.SaveMatrix();

            IDWT iDwt = new IDWT("Intermediate.dwt");

            iDwt.Processing();
            iDwt.SaveImage();

            //Console.WriteLine("\n" + "Press any key to close...");
            //Console.ReadKey();
        }
예제 #2
0
        public async Task <double[][][]> PerformDWT(double[] inputData, MotherWavelet inputWavelet, int maxDecompLevel)
        {
            Signal        signal  = new Signal(inputData);
            MotherWavelet wavelet = inputWavelet;

            double[][][] output = new double[3][][];

            double[][] reconstrData;
            double[][] detailData;
            double[][] approxData;

            detailData   = new double[maxDecompLevel][];
            approxData   = new double[maxDecompLevel][];
            reconstrData = new double[maxDecompLevel][];

            for (int r = 1; r <= maxDecompLevel; r++)
            {
                dwt = DWT.ExecuteDWT(signal, wavelet, r, SignalExtension.ExtensionMode.SymmetricWholePoint, WaveletStudio.Functions.ConvolutionModeEnum.Normal);

                detailData[r - 1] = new double[signal.SamplesCount];
                approxData[r - 1] = new double[signal.SamplesCount];

                reconstrData[r - 1] = new double[signal.SamplesCount];
                reconstrData[r - 1] = DWT.ExecuteIDWT(dwt, wavelet, r, WaveletStudio.Functions.ConvolutionModeEnum.Normal);
            }

            for (int d = 0; d < dwt.Count; d++)
            {
                approxData[d] = dwt[d].Approximation;
                detailData[d] = dwt[d].Details;
            }

            output[0] = detailData;
            output[1] = approxData;
            output[2] = reconstrData;

            return(output);
        }
예제 #3
0
        /// <summary>
        /// 一维离散小波变换
        /// </summary>
        /// <param name="orginal">输入源信号</param>
        /// <param name="dwt">变换类</param>
        /// <returns>当前近似系数(信号低频成分)+细节系数(信号高频成分),各层系数长度</returns>
        public static List <List <double> > DWT1(List <double> orginal, DWT dwt)
        {
            List <List <double> > result = new List <List <double> >();

            if (orginal == null || dwt == null)
            {
                return(result);
            }

            try
            {
                int           lfLength = dwt.Lo_D.Count - 1;
                List <double> extend   = TransformUtil.DWT1Extend("sym", orginal, lfLength);
                if (extend != null && extend.Count > 0)
                {
                    int last = orginal.Count + lfLength;
                    result.Add(dwt.Space(1, last, TransformUtil.Convolve(extend, dwt.Lo_D, "valid")));
                    result.Add(dwt.Space(1, last, TransformUtil.Convolve(extend, dwt.Hi_D, "valid")));
                }
            }
            catch (Exception ex) { }
            return(result);
        }
예제 #4
0
        /// <summary>
        /// 提取近似系数
        /// </summary>
        /// <param name="x">一维小波分解后的结果</param>
        /// <param name="l">层级系数</param>
        /// <param name="dwt">变换类</param>
        /// <param name="i">0 <= i <= length(l)-2</param>
        public static List <double> Appcoef(List <double> x, List <int> l, DWT dwt, int i = -1)
        {
            List <double> result = new List <double>();

            if (x != null && l != null && dwt != null)
            {
                int rmax = l.Count;
                int nmax = rmax - 2, n = nmax;
                if (i >= 0 && i <= nmax)
                {
                    n = i;
                }
                result = x.GetRange(0, l[0]);

                int imax = rmax + 1;
                for (int j = nmax; j >= n + 1; j--)
                {
                    List <double> d = Detcoef(x, l, j);
                    result = IDWT1(result, d, dwt, l[imax - j]);
                }
            }
            return(result);
        }
예제 #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="orginal">输入源信号</param>
        /// <param name="lev">分解层级</param>
        /// <param name="wname">haar、db1~db10</param>
        /// <returns>各层近似系数+细节系数,各层系数</returns>
        public static WaveDec1ViewModel WaveDec1(List <double> orginal, int lev = 1, string wname = "haar")
        {
            WaveDec1ViewModel result = new WaveDec1ViewModel();

            try
            {
                DWT           dwt = new DWT(orginal, wname);//获取到相关的分解系数
                List <double> co  = new List <double>();
                int[]         li  = new int[lev + 2];
                li[li.Length - 1] = orginal.Count;
                for (int i = 0; i < lev; i++)
                {
                    List <List <double> > data = DWTUtil.DWT1(orginal, dwt);
                    if (data != null && data.Count == 2)
                    {
                        orginal = data[0];
                        List <double> re = data[1];
                        if (re != null)
                        {
                            co          = re.Concat(co).ToList();
                            li[lev - i] = re.Count;
                        }
                    }
                }

                co    = orginal.Concat(co).ToList();
                li[0] = orginal.Count;
                result.AppAndDetail = co;
                result.Coefficient  = li.ToList();
                result.Dwt          = dwt;
            }
            catch (Exception ex)
            {
            }
            return(result);
        }
예제 #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="orginal">输入源信号</param>
        /// <param name="lev">分解层级</param>
        /// <param name="wname">haar、db1~db10</param>
        /// <returns></returns>
        public static List <object> WaveDec2(List <List <double> > orginal, int lev = 1, string wname = "haar")
        {
            List <object> result = new List <object>();

            try
            {
                if (orginal != null && orginal.Any())
                {
                    DWT dwt = new DWT(orginal, wname);//获取到相关的分解系数
                    if (dwt != null && dwt.Lo_D != null && dwt.Hi_D != null && dwt.Lo_D.Count == dwt.Hi_D.Count)
                    {
                        List <double>         cl = new List <double>();
                        List <List <double> > s = new List <List <double> >();
                        int r = lev + 2, c = orginal.Count;
                        for (int i = 0; i < r - 1; i++)
                        {
                            List <double> item = new List <double>();
                            for (int j = 0; j < 2; j++)
                            {
                                item.Add(0);
                            }
                            s.Add(item);
                        }
                        s.Add(new List <double> {
                            c, orginal[0].Count
                        });

                        for (int i = 1; i <= lev; i++)
                        {
                            Dictionary <int, List <List <double> > > data = DWTUtil.DWT2(orginal, dwt);
                            if (data != null && data.Count == 4)
                            {
                                //近似分量
                                orginal = data[0];
                                //水平细节分量
                                List <List <double> > ch = data[1];
                                //垂直细节分量
                                List <List <double> > cv = data[2];
                                //对角细节分量
                                List <List <double> > cd = data[3];

                                //可优化,没有操作ca,看DWT2是否需要进行ca的值获取
                                cl = ConvertToLA(ch).Concat(ConvertToLA(cv)).Concat(ConvertToLA(cd)).Concat(cl).ToList();

                                s[r - i - 1] = new List <double> {
                                    orginal.Count, orginal[0].Count
                                };
                            }
                        }
                        s[0] = new List <double> {
                            orginal.Count, orginal[0].Count
                        };

                        result.Add(ConvertToLA(orginal).Concat(cl).ToList());
                        result.Add(s);
                    }
                }
            }
            catch (Exception ex)
            {
                var sd = ex;
            }
            return(result);
        }
예제 #7
0
        /// <summary>
        /// 二维小波变换
        /// </summary>
        /// <param name="orginal">输入源信号</param>
        /// <param name="dwt">变换类</param>
        /// <returns></returns>
        public static Dictionary <int, List <List <double> > > DWT2(List <List <double> > orginal, DWT dwt)
        {
            Dictionary <int, List <List <double> > > result = new Dictionary <int, List <List <double> > >();

            try
            {
                int lodl = dwt.Lo_D.Count - 1, hidl = dwt.Hi_D.Count - 1, orginalRow = orginal.Count, orginalCol = orginal[0].Count;
                List <List <double> > y = TransformUtil.DWT2Extend("addcol", "sym", orginal, lodl);
                List <List <double> > convresult = TransformUtil.Convolve(y, dwt.Lo_D, "valid");

                //近似分量
                result.Add(0, TransformUtil.ConvDown(convresult, dwt.Lo_D, lodl, orginalRow, orginalCol));
                //水平细节分量
                result.Add(1, TransformUtil.ConvDown(convresult, dwt.Hi_D, hidl, orginalRow, orginalCol));
                convresult = TransformUtil.Convolve(y, dwt.Hi_D, "valid");
                //垂直细节分量
                result.Add(2, TransformUtil.ConvDown(convresult, dwt.Lo_D, lodl, orginalRow, orginalCol));
                result.Add(3, TransformUtil.ConvDown(convresult, dwt.Hi_D, hidl, orginalRow, orginalCol));
            }
            catch (Exception ex) { }
            return(result);
        }
예제 #8
0
        /// <summary>
        /// Executes the block
        /// </summary>
        public override void Execute()
        {
            var connectingNode = InputNodes[0].ConnectingNode as BlockOutputNode;

            if (connectingNode == null || connectingNode.Object == null)
            {
                return;
            }
            var signalIndex = 0;

            OutputNodes[0].Object.Clear();
            OutputNodes[1].Object.Clear();
            OutputNodes[2].Object.Clear();
            OutputNodes[3].Object.Clear();
            foreach (var signal in connectingNode.Object)
            {
                signalIndex++;
                var name = signal.Name;
                if (!string.IsNullOrEmpty(name))
                {
                    name += " - ";
                }
                else
                {
                    name = Resources.Signal + " " + signalIndex + " - ";
                }
                var decompositionLevels = DWT.ExecuteDWT(signal, _motherWavelet, Level, ExtensionMode);
                foreach (var level in decompositionLevels)
                {
                    var apxSignal = signal.Copy();
                    apxSignal.Name    = name + Resources.ApproximationLevel + " " + (level.Index + 1);
                    apxSignal.Samples = level.Approximation;
                    OutputNodes[0].Object.Add(apxSignal);
                    if (Rescale)
                    {
                        var rescaledApx = RescaleSignal(apxSignal, signal, level);
                        OutputNodes[3].Object.Add(rescaledApx);
                    }
                    else
                    {
                        OutputNodes[3].Object.Add(apxSignal);
                    }

                    var detSignal = signal.Copy();
                    detSignal.Name    = name + Resources.DetailsLevel + " " + (level.Index + 1);
                    detSignal.Samples = level.Details;
                    OutputNodes[1].Object.Add(detSignal);
                    if (Rescale)
                    {
                        var rescaledDet = RescaleSignal(detSignal, signal, level);
                        OutputNodes[3].Object.Add(rescaledDet);
                    }
                    else
                    {
                        OutputNodes[3].Object.Add(detSignal);
                    }
                }
                var reconstruction = DWT.ExecuteIDWT(decompositionLevels, _motherWavelet, Level);
                var recSignal      = signal.Copy();
                recSignal.Name    = name + Resources.Reconstruction;
                recSignal.Samples = reconstruction;
                OutputNodes[2].Object.Add(recSignal);
                OutputNodes[3].Object.Add(recSignal);
            }
            if (!Cascade)
            {
                return;
            }
            foreach (var output in OutputNodes.Where(output => output.ConnectingNode != null))
            {
                output.ConnectingNode.Root.Execute();
            }
        }
예제 #9
0
        /// <summary>
        /// 小波基函数
        /// </summary>
        /// <param name="wname">小波名称</param>
        /// <param name="infoModel">小波信息</param>
        /// <param name="iter">迭代次数</param>
        public static WavefunModel Wavefun(string wname, WaveletsInfoModel infoModel, int iter)
        {
            WavefunModel data = new WavefunModel();

            if (!string.IsNullOrEmpty(wname))
            {
                string debut = wname.Substring(0, 2);
                double coef = Math.Pow(Math.Sqrt(2), iter), pas = (double)1 / Math.Pow(2, iter);
                switch (infoModel.type)
                {
                case 1:
                    DWT dwt   = new DWT(wname);
                    int logn  = dwt.Lo_R.Count;
                    int nbpts = Convert.ToInt32((logn - 1) / pas + 1);

                    List <double> psi = DWTUtil.Upcoef("d", dwt, iter);
                    if (psi != null && psi.Any())
                    {
                        psi = psi.Select(m => m * coef).ToList();
                    }
                    List <int> result = GetNBpts(nbpts, iter, logn);   //nbpts、nb、dn

                    int nb = result[1], dn = result[2] + 1;
                    nbpts = result[0];
                    DWTUtil.Wkeep1(psi, nb, "c");
                    psi.Insert(0, 0);
                    for (int i = 1; i <= dn; i++)
                    {
                        psi.Add(0);
                    }

                    //sign depends on wavelet
                    if ("co".Equals(debut) || "sy".Equals(debut) || "dm".Equals(debut))
                    {
                        psi = psi.Select(m => - m).ToList();
                    }

                    //data.phi = phi;
                    data.psi  = psi;
                    data.type = infoModel.type;
                    data.xval = Linspace(0, (nbpts - 1) * pas, nbpts);
                    break;

                case 2:
                    break;

                case 3:
                    break;

                case 4:
                    data = Morlet(infoModel.bounds[0], infoModel.bounds[1], (int)Math.Pow(2, iter));
                    break;

                case 5:
                    break;

                default:
                    break;
                }
            }
            return(data);
        }