开元食味
德国频道
楼主: loveless
打印 上一主题 下一主题

做实习遇到的问题

[复制链接]
31#
 楼主| 发表于 17.6.2006 16:38:39 | 只看该作者
<!--QuoteBegin-loveless+17.06.2006, 16:31 --><div class='quotetop'>QUOTE(loveless @ 17.06.2006, 16:31 )</div><div class='quotemain'><!--QuoteEBegin-->// Onur G. Guleryuz 1995, 1996, 1997,<br />// University of Illinois at Urbana-Champaign,<br />// Princeton University,<br />// Polytechnic University.<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;wav_filters_extern.h&quot;<br />#include &quot;wav_gen.h&quot;<br />#include &quot;alloc.h&quot;<br /><br />// Extend data by ofs pixels on both ends using periodic <br />// symmetry. data should be &quot;pointing in&quot; to allow up to data[-ofs]<br />// and data[N-1+ofs]. <br />// ofs&gt;=N is handled.<br /><br />void extend_periodic(float *data,int N,int ofs)<br /><br />{<br />        int i,k;<br /><br />        k=N-1;<br />        for(i=1;i&lt;=ofs;i++) {<br /><br />&nbsp; data[-i]=data[N-i];<br />&nbsp; data[k+i]=data[i-1];<br />        }<br />}<br /><br />// Extend data by ofs pixels on both ends using mirror <br />// symmetry. data should be &quot;pointing in&quot; to allow up to data[-ofs]<br />// and data[N-1+ofs]. <br />//<br />// There are two possible &quot;mirrors&quot;, i.e., data[-1]=data[1] (mirror on 0) <br />// or data[-1]=data[0] (mirror &quot;between&quot; -1 and 0). phase is either 0, 1, or 2<br />// to select among these cases. See if(phase==... below.        <br />        <br />void extend_mirror(float *data,int N,int ofs,int phase)<br /><br />{<br />        int i,k;<br />        int phase1,phase2;<br /><br />        if((phase&lt;0)||(phase&gt;2)) {<br /><br />&nbsp; printf(&quot;extend_mirror: illegal phase\n&quot;);<br />&nbsp; exit(1);<br />        }<br /><br />        if(phase==2){<br />&nbsp; // At left boundary the mirror is on 0.<br />&nbsp; phase1=0;<br /><br />&nbsp; // At right boundary the mirror is on N-1.<br />&nbsp; phase2=1;<br />        }<br />        else {<br /><br />&nbsp; // phase==0, at left mirror on 0, and at right it&#39;s between.<br />&nbsp; // phase==1, at left mirror between, and at right it&#39;s on N-1.<br />&nbsp; phase1=phase2=phase;<br />        }<br /><br />        k=N-1;<br />&nbsp; <br />        if(N==1) {<br /><br />&nbsp; for(i=1;i&lt;=ofs;i++) {<br /><br />&nbsp;         data[-i]=data[0];<br />&nbsp;         data[k+i]=data[0];<br />&nbsp; }<br />        }<br />        else<br />&nbsp; for(i=1;i&lt;=ofs;i++) {<br /><br />&nbsp;         data[-i]=data[i-phase1];<br />&nbsp;         data[k+i]=data[N-phase2-i];<br />&nbsp; }<br />}<br /><br />// This routine is used in evaluating forward wavelet transforms.<br />//<br />// data of dimension N contains the input.<br />// float *filter contains the Nf filter taps.<br />// ofs is the decimation factor.<br />//<br />// filtering starts at beg and continues until N+beg, yielding N/ofs samples. <br />// data needs to be padded suitably at both ends.<br />// This hoopla about the starting point is in place to ensure <br />// correct boundary processing when evaluating wavelet transforms.<br />//<br />// coef returns the result of the filtering and decimation.<br />// <br />// Viewed as a transform the basis function that generates the<br />// coefficient of index 0 is &quot;&lt;- fliplr(filter) -&gt; (beg)&quot;, <br />// i.e., the scalar product obtained by positioning <br />// the flipped filter (formed into a row vector) <br />// with the right side positioned on top of sample beg in data.<br /><br />int filter_n_decimate(float *data,float *coef,int N,float *filter,<br />&nbsp; &nbsp; &nbsp; int Nf,int beg,int ofs)<br /><br />{<br />        int i,j,k;<br />        float temp;<br /><br />        k=0;<br />        for(i=beg;i&lt;N+beg;i+=ofs) {<br /><br />&nbsp; temp=0;<br />&nbsp; for(j=i;j&gt;i-Nf;j--)<br />&nbsp;         temp+=data[j]*filter[i-j];<br /><br />&nbsp; coef[k]=temp;<br />&nbsp; k++;<br />        }<br /><br />        return(k);<br />}<br /><br />// This routine is used in evaluating inverse wavelet transforms.<br />//<br />// Upsample and filter to implement a synthesis filter bank.<br />// Basically the inverse of filter_n_decimate() above.<br />// No actual upsampling etc., to avoid zero multiplies.<br />//<br />// coef is the input and contains coefficients resulting from <br />// filtering and decimation by ofs. <br />//<br />// Because this routine is typically called twice for inverse wavelet<br />// transforms, once for the low band and once for high, data is incremented via +=.<br />// Hence data should initially be set to 0.<br />//<br />// Viewed as a transform, filter_n_decimate above starts by putting the <br />// &quot;flipped&quot; forward filter at begf, i.e.,&nbsp; &lt;- fliplr(ffilter) -&gt;(begf)<br />// The resulting coefficient is at index 0.<br />// Here we are upsampling by ofs and filtering with the inv. filter<br />// time advanced by fbeg so the coefficient at index 0, multiplies the basis function<br />// (-fbeg)&lt;-(ifilter)-&gt;(Nf-1-fbeg=beg).<br />// <br />// How is that for confusing? All of this makes sense,<br />// when you write it down carefully. But who has the time ...<!--emo&--><img src='style_emoticons/<#EMO_DIR#>/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--><br /><br />void upsample_n_filter(float *coef,float *data,int N,float *filter,<br />&nbsp; &nbsp; &nbsp; int Nf,int beg,int ofs)<br /><br />{<br />        int i,j,l,n,p,fbeg;<br />        float temp;<br /><br />        fbeg=Nf-beg-1;<br /><br />        for(i=0;i&lt;N;i++) {<br /><br />&nbsp; l=0;<br />&nbsp; n=(i+fbeg)%ofs;<br />&nbsp; p=(i+fbeg)/ofs;<br /><br />&nbsp; temp=0;<br />&nbsp; for(j=n;j&lt;Nf;j+=ofs) {<br /><br />&nbsp;         temp+=coef[p-l]*filter[j];<br />&nbsp;         l++;<br />&nbsp; }<br /><br />&nbsp; // += for successive calls for low and high bands. <br />&nbsp; data+=temp;<br />        }<br />}<br /><br />// Used in forward wavelet trf.<br />//<br />// All rows of the image are run through the dual filterbank<br />// given by lp and hp. Results are returned in image &quot;in place&quot;.<br />// low freq. coefficients start at 0 and end at N/2, where high freq.<br />// info starts.<br />void filt_n_dec_all_rows(float **image,int Ni,int Nj,float *lp,int Nl,<br />&nbsp; &nbsp; &nbsp;         float *hp,int Nh)<br /><br />{<br />        int i,j,ext,ofs;<br />        float *data;<br /><br />        ext=max(Nl,Nh);<br />        data=allocate_1d_float((Nj+2*ext),0);<br />        // Point in for required extensions.<br />        data+=ext;<br /><br />        // offset for the location where high band coefficients<br />        // should be copied.<br />        ofs=Nj&gt;&gt;1;<br /><br />        for(i=0;i&lt;Ni;i++) {<br />&nbsp; <br />&nbsp; // Copy row.<br />&nbsp; for(j=0;j&lt;Nj;j++)<br />&nbsp;         data[j]=image[j];<br /><br />&nbsp; // Extend.<br />&nbsp; if(PS)<br />&nbsp;         extend_periodic(data,Nj,ext);<br />&nbsp; else {<br />&nbsp;         // Mirrors at end points.<br />&nbsp;         extend_mirror(data,Nj,ext,2);<br />&nbsp; }<br /><br />&nbsp; filter_n_decimate(data,image,Nj,lp,Nl,begflp,2);<br />&nbsp; filter_n_decimate(data,image+ofs,Nj,hp,Nh,begfhp,2);<br />&nbsp; }<br /><br />        data-=ext;<br />        free((void *)data);<br />        }<br /><br />// Used in forward wavelet trf.<br />//<br />// Index swapped version of filt_n_dec_all_rows.<br />void filt_n_dec_all_cols(float **image,int Ni,int Nj,float *lp,int Nl,<br />&nbsp; &nbsp; &nbsp;         float *hp,int Nh)<br /><br />{<br />        int i,j,ext,ofs;<br />        float *data,*data2;<br /><br />        ext=max(Nl,Nh);<br />        data=allocate_1d_float((Ni+2*ext),0);<br />        // Point in for required extensions.<br />        data+=ext;<br /><br />        // Need second array since cannot access columns directly via pointers.<br />        data2=allocate_1d_float(Ni,0);<br /><br />        // offset for the location where high band coefficients<br />        // should be copied.<br />        ofs=Ni&gt;&gt;1;<br /><br />        for(j=0;j&lt;Nj;j++) {<br />&nbsp; <br />&nbsp; // Copy column.<br />&nbsp; for(i=0;i&lt;Ni;i++)<br />&nbsp;         data=image[j];<br /><br />&nbsp; // Extend.<br />&nbsp; if(PS)<br />&nbsp;         extend_periodic(data,Ni,ext);<br />&nbsp; else {<br />&nbsp;         // Mirrors at end points.<br />&nbsp;         extend_mirror(data,Ni,ext,2);<br />&nbsp; }<br /><br />&nbsp; filter_n_decimate(data,data2,Ni,lp,Nl,begflp,2);<br />&nbsp; filter_n_decimate(data,data2+ofs,Ni,hp,Nh,begfhp,2);<br /><br />&nbsp; for(i=0;i&lt;Ni;i++)<br />&nbsp;         image[j]=data2;<br />&nbsp; }<br /><br />        data-=ext;<br />        free((void *)data);<br />        free((void *)data2);<br />        }<br /><br />// Used in inverse wavelet trf.<br />//<br />// All rows of the image are run through the dual synthesis filterbank<br />// given by lp and hp having number of taps Nl and Nh respectively. <br />// Results are returned in image &quot;in place&quot;.<br />//<br />// Here we actaully need to know the applied shift to the transform,<br />// hence the passed parameters lev and shift_arr.<br /><br />void ups_n_filt_all_rows(float **image,int Ni,int Nj,float *lp,int Nl,<br />&nbsp; &nbsp; &nbsp;         float *hp,int Nh,int lev,int *shift_arr)<br /><br />{<br />        int i,j,k,ext,ofs;<br />        float *data1,*data2;<br /><br />        ext=max(Nl,Nh);<br />        ofs=Nj&gt;&gt;1;<br /><br />        data1=allocate_1d_float((ofs+2*ext),0);<br />        data2=allocate_1d_float((ofs+2*ext),0);<br />        data1+=ext;data2+=ext;<br /><br />        for(i=0;i&lt;Ni;i++) {        <br /><br />&nbsp; for(j=0;j&lt;ofs;j++) {<br /><br />&nbsp;         k=j+ofs;<br />&nbsp;         // low pass and high pass coefficients.<br />&nbsp;         data1[j]=image[j];image[j]=0;<br />&nbsp;         data2[j]=image[k];image[k]=0;<br />&nbsp; }<br /><br />&nbsp; // Take care of the extension at the boundaries.<br />&nbsp; if(PS) {<br /><br />&nbsp;         extend_periodic(data1,ofs,ext);        <br />&nbsp;         extend_periodic(data2,ofs,ext);        <br />&nbsp; }<br />&nbsp; else {<br /><br />&nbsp;         // shift_arr[lev]=0 OR 1.<br />&nbsp;         // The symmetric banks used are positioned so that on the left side<br />&nbsp;         // the forward lowpass filter has its point of symmetry exactly on top of 0<br />&nbsp;         // and forward high pass filter has its point of symmetry exactly on top of 1. <br />&nbsp;         // This is coordinated by calling filter_n_decimate() with the proper value of beg.<br />&nbsp;         //<br />&nbsp;         // The above is reversed at the right side assuming decimation by 2. <br />&nbsp;         // Hence shift_arr[lev]==0 =&gt; at left boundary the mirror is at 0, <br />&nbsp;         // at right boundary it&#39;s between, see extend_mirror().<br /><br />&nbsp;         // If shift_arr[lev]==1 then the positions for the low and high are reversed<br />&nbsp;         // since the filters are shifted so if<br />&nbsp;         // shift_arr[lev]==1 =&gt; at left boundary the mirror is between, <br />&nbsp;         // at right boundary it&#39;s at 0.<br />&nbsp;         extend_mirror(data1,ofs,ext,shift_arr[lev]);        <br />&nbsp;         extend_mirror(data2,ofs,ext,1-shift_arr[lev]);        <br />&nbsp; }<br /><br />&nbsp; // invert low pass.<br />&nbsp; upsample_n_filter(data1,image,Nj,lp,Nl,begilp,2);<br />&nbsp; // invert high pass.<br />&nbsp; upsample_n_filter(data2,image,Nj,hp,Nh,begihp,2);<br />        }<br /><br />        data1-=ext;data2-=ext;<br />        free((void *)data1);<br />        free((void *)data2);<br />}<br /><br />// Used in inverse wavelet trf.<br />//<br />// Index swapped version of ups_n_filt_all_rows.<br />void ups_n_filt_all_cols(float **image,int Ni,int Nj,float *lp,int Nl,<br />&nbsp; &nbsp; &nbsp;         float *hp,int Nh,int lev,int *shift_arr)<br /><br />{<br />        int i,j,k,ext,ofs;<br />        float *data1,*data2,*data3;<br /><br />        ext=max(Nl,Nh);<br />        ofs=Ni&gt;&gt;1;<br /><br />        data1=allocate_1d_float((ofs+2*ext),0);<br />        data2=allocate_1d_float((ofs+2*ext),0);<br />        data1+=ext;data2+=ext;<br /><br />        // Need third array since cannot access columns directly via pointers.<br />        data3=allocate_1d_float(Ni,0);<br /><br />        for(j=0;j&lt;Nj;j++) {        <br /><br />&nbsp; for(i=0;i&lt;ofs;i++) {<br /><br />&nbsp;         k=i+ofs;<br />&nbsp;         // low pass and high pass coefficients.<br />&nbsp;         data1=image[j];<br />&nbsp;         data2=image[k][j];<br />&nbsp;         data3=data3[k]=0;<br />&nbsp; }<br /><br />&nbsp; if(PS) {<br /><br />&nbsp;         extend_periodic(data1,ofs,ext);        <br />&nbsp;         extend_periodic(data2,ofs,ext);        <br />&nbsp; }<br />&nbsp; else {<br /><br />&nbsp;         extend_mirror(data1,ofs,ext,shift_arr[lev]);        <br />&nbsp;         extend_mirror(data2,ofs,ext,1-shift_arr[lev]);        <br />&nbsp; }<br /><br />&nbsp; upsample_n_filter(data1,data3,Ni,lp,Nl,begilp,2);<br />&nbsp; upsample_n_filter(data2,data3,Ni,hp,Nh,begihp,2);<br /><br />&nbsp; for(i=0;i&lt;Ni;i++)<br />&nbsp;         image[j]=data3;<br />        }<br /><br />        data1-=ext;data2-=ext;<br />        free((void *)data1);<br />        free((void *)data2);<br />        free((void *)data3);<br />}<br />[right][snapback]1008971[/snapback][/right]<br /><!--QuoteEnd--></div><!--QuoteEEnd--><br /><br />我其实只需要Wavelet变换的代码。以上的是不是太多了?<br />
回复 支持 反对

使用道具 举报

32#
 楼主| 发表于 17.6.2006 17:09:46 | 只看该作者
那我该怎么办啊?我把东西都给你,你给我看看行吗?
回复 支持 反对

使用道具 举报

33#
 楼主| 发表于 17.6.2006 17:31:30 | 只看该作者
回复 支持 反对

使用道具 举报

34#
 楼主| 发表于 17.6.2006 22:22:50 | 只看该作者
// Onur G. Guleryuz 1995, 1996, 1997,<br />// University of Illinois at Urbana-Champaign,<br />// Princeton University,<br />// Polytechnic University.<br /><br />#include &quot;wav_basic.h&quot;<br />#include &quot;wav_filters_extern.h&quot;<br />#include &quot;alloc.h&quot;<br />#include &quot;wav_gen.h&quot;<br /><br />// Macro that sets filter parameters.<br />// Called via choose_filter().<br />#define set_filter_param(fname) \<br />{ \<br />        MFLP= fname ## _FLP; \<br />        MFHP= fname ## _FHP; \<br />        MILP= fname ## _ILP; \<br />        MIHP= fname ## _IHP; \<br />        \<br />        /* Filter size. */ \<br />        Nflp= fname ## _Nflp; \<br />        Nfhp= fname ## _Nfhp; \<br />        Nilp= fname ## _Nilp; \<br />        Nihp= fname ## _Nihp; \<br />        \<br />        /* Filter symmetry */ \<br />        PS= fname ## _PS; \<br />        \<br />        /* Filter starting points. */ \<br />        begflp=mfl= fname ## _begflp; \<br />        begfhp=mfh= fname ## _begfhp; \<br />        begilp=mil= fname ## _begilp; \<br />        begihp=mih= fname ## _begihp; \<br />}<br /><br />// Set wavelet filter parameters depending on name<br />// and tap. See wav_filters.h and wav_filters_extern.h <br />// This routine must be called before doing any transforms<br />// to select which wavelet bank to use.<br />void choose_filter(char name,int tap)<br /><br />{<br />        switch (name) {<br />                case &#39;A&#39;:<br />                        switch (tap) {<br />                                default:<br />                                        set_filter_param(Antonini);<br />                        }<br />                        break;<br /><br />                case &#39;H&#39;:<br />                        switch (tap) {<br />                                default:<br />                                        set_filter_param(Haar);<br />                        }<br />                        break;<br /><br />                case &#39;N&#39;:<br />                        switch (tap) {<br />                                case -1:<br />                                        set_filter_param(Nick_flip);<br />                                        break;<br /><br />                                default:<br />                                        set_filter_param(Nick);<br />                        }<br />                        break;<br /><br />                default:<br />                        switch (tap) {<br />                                case 9:<br />                                        set_filter_param(D79);<br />                                        break;<br /><br />                                default:<br />                                        set_filter_param(D8);<br />                        }<br />        }<br />}<br /><br />// 2D &quot;in place&quot; wavelet transform. Input data is in<br />// float **image and output is returned inside image.<br />//<br />// levs&gt;=1 is the number of wavelet levels.<br />//<br />// Ni and Nj are the dimensions of the image.<br />// Ni and Nj should be divisible by 2^levs.<br />//<br />// shift_arr_row and shift_arr_col (each of dimension levs)<br />// contain the amount of shift (0 or 1)<br />// that should be applied to filters in each level for transforms over rows and columns.<br />// The use of shift_arr_row and shift_arr_col is mainly intended for <br />// overcomplete filtering/transforms.<br />//<br />// forw &#33;= 0 for a forward transform (inverse is calculated otherwise).<br />//<br />// float *lp of dimension Nl contains the low pass wavelet filter.<br />// float *hp of dimension Nh contains the high pass wavelet filter.<br />//<br />void wav2d_inpl(float **image,int Ni,int Nj,int levs,float *lp,int Nl,<br />                                                float *hp,int Nh,char forw,int *shift_arr_row,int *shift_arr_col)<br /><br />{<br />        int i,dimi,dimj;<br /><br />        dimi=(forw)?NiNi&gt;&gt;(levs-1));<br />        dimj=(forw)?NjNj&gt;&gt;(levs-1));<br /><br />        for(i=0;i&lt;levs;i++) {<br /><br />                if(forw) {<br /><br />                        // Do the rows.<br /><br />                        // Adjust filter parameters for overcomplete filtering.<br />                        begflp=mfl+shift_arr_row;   <br />                        begfhp=mfh-shift_arr_row;<br /><br />                        filt_n_dec_all_rows(image,dimi,dimj,lp,Nl,hp,Nh);<br /><br />                        // Now the columns.<br /><br />                        begflp=mfl+shift_arr_col;   <br />                        begfhp=mfh-shift_arr_col;<br /><br />                        filt_n_dec_all_cols(image,dimi,dimj,lp,Nl,hp,Nh);<br />                }<br />                else {<br /><br />                        // Rows.<br />                        begilp=mil+shift_arr_row[levs-1-i];<br />                        begihp=mih-shift_arr_row[levs-1-i];<br /><br />                        ups_n_filt_all_rows(image,dimi,dimj,lp,Nl,hp,Nh,levs-1-i,shift_arr_row);<br /><br />                        // Columns.<br />                        begilp=mil+shift_arr_col[levs-1-i];<br />                        begihp=mih-shift_arr_col[levs-1-i];<br /><br />                        ups_n_filt_all_cols(image,dimi,dimj,lp,Nl,hp,Nh,levs-1-i,shift_arr_col);<br />                }<br /><br />                dimi=(forw)?(dimi&gt;&gt;1)dimi&lt;&lt;1);<br />                dimj=(forw)?(dimj&gt;&gt;1)dimj&lt;&lt;1);<br />        }<br />}<br /><br /><br /><br />// 2-D &quot;in place&quot; wavelet packet transform.<br />// See wav2d_inpl() for an explanation of parameters.<br />//<br />// This routine will grow a full packet tree for levels upto LL_ONLY_AFTER_LEV <br />// and just a wavelet tree afterward, i.e., if levs&gt;LL_ONLY_AFTER_LEV<br />// we grow wavelets only over LL band after LL_ONLY_AFTER_LEV.<br />// LL_ONLY_AFTER_LEV is set in wav_gen.h Just set it to some large number<br />// if you want packets all the way.<br />// <br />// Ni and Nj should be divisible by 2^levs.<br />// shift_arr_row and shift_arr_col contain the amount of shift (0 or 1)<br />// that should be applied to filters in each level.<br />// This is mainly intended for overcomplete filtering.<br />// See wav2d_inpl() comments.<br />//<br />void wavpack2d_inpl(float **image,int Ni,int Nj,int levs,float *lp,int Nl,<br />                                                float *hp,int Nh,char forw,int *shift_arr_row,int *shift_arr_col)<br /><br />{<br />        int i,k,l,dimi,dimj;<br />        int p,q,rcnt,ccnt;<br />        float **buffer;<br /><br />        buffer=allocate_2d_float(Ni,Nj,0);<br /><br />        dimi=(forw)?NiNi&gt;&gt;(levs-1));<br />        dimj=(forw)?Nj:(Nj&gt;&gt;(levs-1));<br /><br />        for(i=0;i&lt;levs;i++) {<br /><br />                // Number of row bands.<br />                rcnt=Ni/dimi;<br /><br />                // Number of column bands.<br />                ccnt=Nj/dimj;<br /><br />                if(forw&&(i&gt;=LL_ONLY_AFTER_LEV)) {<br />                        // Grow wavelets only over LL band after LL_ONLY_AFTER_LEV.<br />                        rcnt=ccnt=1;<br />                }<br />                else if((&#33;forw)&&(levs-1-i&gt;=LL_ONLY_AFTER_LEV)) {<br />                        // Inverse wavelets only over LL band after LL_ONLY_AFTER_LEV.<br />                        rcnt=ccnt=1;<br />                }<br /><br />                // Do the next level of the wavelet tree over all of<br />                // the bands we are supposed to grow on.<br />                for(p=0;p&lt;rcnt;p++)<br />                        for(q=0;q&lt;ccnt;q++) {<br /><br />                                for(k=0;k&lt;dimi;k++)<br />                                        for(l=0;l&lt;dimj;l++)<br />                                                buffer[k][l]=image[p*dimi+k][q*dimj+l];<br /><br />                                if(forw) {<br /><br />                                        // Do the rows.<br /><br />                                        // Adjust filter parameters for overcomplete filtering.<br />                                        begflp=mfl+shift_arr_row;   <br />                                        begfhp=mfh-shift_arr_row;<br /><br />                                        filt_n_dec_all_rows(buffer,dimi,dimj,lp,Nl,hp,Nh);<br /><br />                                        // Now the columns.<br />                                        begflp=mfl+shift_arr_col;   <br />                                        begfhp=mfh-shift_arr_col;<br /><br />                                        filt_n_dec_all_cols(buffer,dimi,dimj,lp,Nl,hp,Nh);<br />                                }<br />                                else {<br /><br />                                        // Rows.<br />                                        begilp=mil+shift_arr_row[levs-1-i];<br />                                        begihp=mih-shift_arr_row[levs-1-i];<br /><br />                                        ups_n_filt_all_rows(buffer,dimi,dimj,lp,Nl,hp,Nh,levs-1-i,shift_arr_row);<br /><br />                                        // Columns.<br />                                        begilp=mil+shift_arr_col[levs-1-i];<br />                                        begihp=mih-shift_arr_col[levs-1-i];<br /><br />                                        ups_n_filt_all_cols(buffer,dimi,dimj,lp,Nl,hp,Nh,levs-1-i,shift_arr_col);<br />                                }<br /><br />                                for(k=0;k&lt;dimi;k++)<br />                                        for(l=0;l&lt;dimj;l++)<br />                                                image[p*dimi+k][q*dimj+l]=buffer[k][l];<br />                        }<br /><br />                dimi=(forw)?(dimi&gt;&gt;1):(dimi&lt;&lt;1);<br />                dimj=(forw)?(dimj&gt;&gt;1):(dimj&lt;&lt;1);<br />        }<br /><br />        free_2d_float(buffer,Ni);<br />}<br /><br />// Forward complex wavelet transform using Kingsbury&#39;s paper.<br />// Please check with Nick Kingsbury&#39;s paper to confirm that<br />// I am doing things correctly here.<br />//<br />// Input is in float **im, and the results are returned in 4<br />// **float&#39;s, trf[0],...,trf[3].<br />//<br />// Ni, Nj multiples of 2^levs.<br />// levs&gt;=1.<br />// See wav2d_inpl() for an explanation of parameters.<br />//<br />void complex_wav_forw(float **im,float ***trf,int Ni,int Nj,int levs)<br /><br />{<br />        int i,j,k,l;<br />        int Nl,Nh,dimi,dimj,hdimi,hdimj;<br />        float *lp,*hp;<br />        int shift_arr_r[MAX_ARR_SIZE],shift_arr_c[MAX_ARR_SIZE];<br />        float tmp;<br /><br />        // Choose Antonini.<br />        choose_filter(&#39;A&#39;,0);<br /><br />        lp=MFLP;Nl=Nflp;  <br />        hp=MFHP;Nh=Nfhp;<br /><br />        // First level, fully overcomplete resulting 4x redundancy.<br />        // Results are in trf.<br />        for(i=0;i&lt;4;i++) {<br /><br />                for(k=0;k&lt;Ni;k++)<br />                        for(l=0;l&lt;Nj;l++)<br />                                trf[k][l]=im[k][l];<br /><br />                // Set shifts as specified by Kingsbury&#39;s paper.<br />                if(i/2==0)<br />                        shift_arr_r[0]=1;<br />                else<br />                        shift_arr_r[0]=0;<br /><br />                if(i%2==0)<br />                        shift_arr_c[0]=1;<br />                else<br />                        shift_arr_c[0]=0;<br /><br />                // Transform.<br />                wav2d_inpl(trf,Ni,Nj,1,lp,Nl,hp,Nh,1,shift_arr_r,shift_arr_c);<br />        }<br /><br />        // Now grow complex wavelets over the LL band<br />        // using Kingsbury&#39;s orthogonal bank.<br />        if(levs&gt;1) {<br /><br />                for(i=0;i&lt;4;i++) {<br /><br />                        dimi=Ni/2;<br />                        dimj=Nj/2;<br />                        for(j=1;j&lt;levs;j++) {<br />        <br />                                if(i/2==0) {<br />                                        // Regular orth. bank.<br />                                        choose_filter(&#39;N&#39;,0);<br />                                }<br />                                else {<br />                                        // Flipped orth. bank (see Kingsbury).<br />                                        // Flipped is same as inverse.<br />                                        choose_filter(&#39;N&#39;,-1);<br />                                }<br />                <br />                                lp=MFLP;Nl=Nflp;  <br />                                hp=MFHP;Nh=Nfhp;<br /><br />                                // Transform over rows.<br />                                filt_n_dec_all_rows(trf,dimi,dimj,lp,Nl,hp,Nh);<br />        <br />                                if(i%2==0) {<br />                                        // Regular.<br />                                        choose_filter(&#39;N&#39;,0);<br />                                }<br />                                else {<br />                                        // Flipped.<br />                                        choose_filter(&#39;N&#39;,-1);<br />                                }<br />        <br />                                lp=MFLP;Nl=Nflp;  <br />                                hp=MFHP;Nh=Nfhp;<br /><br />                                // Transform over columns.<br />                                filt_n_dec_all_cols(trf,dimi,dimj,lp,Nl,hp,Nh);<br />                <br />                                dimi&gt;&gt;=1;<br />                                dimj&gt;&gt;=1;<br />                <br />                        }<br />                }<br />        }<br /><br />        // Generate the complex wavelet coefficients.<br />        hdimi=Ni/(1&lt;&lt;levs);<br />        hdimj=Nj/(1&lt;&lt;levs);<br /><br />        for(k=0;k&lt;Ni;k++)<br />                for(l=0;l&lt;Nj;l++) {<br /><br />                        // After this computation the complex wavelet coefficients<br />                        // are given by trf[0]+jtrf[2] and trf[3]+jtrf[1];<br />                        tmp=trf[0][k][l]+trf[3][k][l];<br />                        trf[3][k][l]=trf[0][k][l]-trf[3][k][l];<br />                        trf[0][k][l]=tmp;<br /><br />                        tmp=trf[1][k][l]+trf[2][k][l];<br />                        // It is possible that the below is 2 - 1.<br />                        trf[2][k][l]=trf[1][k][l]-trf[2][k][l];<br />                        trf[1][k][l]=tmp;<br />                }<br />}<br /><br />// Inverse complex wavelet transform.<br />// trf is modified in intermediate computations.<br />// Ni, Nj multiples of 2^levs<br />// levs&gt;=1.<br />//<br />// See complex_wav_forw() comments.<br />//<br />float **complex_wav_inv(float ***trf,int Ni,int Nj,int levs)<br /><br />{<br />        int i,j,k,l;<br />        int Nl,Nh,dimi,dimj,hdimi,hdimj;<br />        float *lp,*hp;<br />        int shift_arr_r[MAX_ARR_SIZE],shift_arr_c[MAX_ARR_SIZE];<br />        float tmp;<br />        float **im;<br /><br /><br />        // Clean the filter shift arrays.<br />        for(i=0;i&lt;1&lt;&lt;levs;i++)<br />                shift_arr_r=shift_arr_c=0;<br /><br />        // Get back the intermediate wavelet coefficients from the<br />        // complex wavelet coefficients.<br />        hdimi=Ni/(1&lt;&lt;levs);<br />        hdimj=Nj/(1&lt;&lt;levs);<br /><br />        for(k=0;k&lt;Ni;k++)<br />                for(l=0;l&lt;Nj;l++) {<br /><br />                        // Prior to this computation the complex wavelet coefficients<br />                        // are given by trf[0]+jtrf[2] and trf[3]+jtrf[1];<br />                        tmp=(trf[0][k][l]+trf[3][k][l])/2;<br />                        trf[3][k][l]=(trf[0][k][l]-trf[3][k][l])/2;<br />                        trf[0][k][l]=tmp;<br /><br />                        tmp=(trf[1][k][l]+trf[2][k][l])/2;<br />                        trf[2][k][l]=(trf[1][k][l]-trf[2][k][l])/2;<br />                        trf[1][k][l]=tmp;<br />                }<br /><br />        if(levs&gt;1) {<br /><br />                for(i=0;i&lt;4;i++) {<br />        <br />                        dimi=Ni&gt;&gt;(levs-1);<br />                        dimj=Nj&gt;&gt;(levs-1);<br />        <br />                                <br />                        for(j=1;j&lt;levs;j++) {<br />        <br />                                if(i/2==0) {<br />                                        // Regular inverse, it just happens that orth. inverses are flipped.<br />                                        choose_filter(&#39;N&#39;,0);<br />                                }<br />                                else {<br />                                        // Flipped inverse.<br />                                        choose_filter(&#39;N&#39;,-1);<br />                                }<br /><br />                                lp=MILP;Nl=Nilp;  <br />                                hp=MIHP;Nh=Nihp;<br /><br />                                // Inverse transform over rows.<br />                                ups_n_filt_all_rows(trf,dimi,dimj,lp,Nl,hp,Nh,levs-1-j,shift_arr_r);<br />                <br />        <br />                                if(i%2==0) {<br />                                        // Regular inverse.<br />                                        choose_filter(&#39;N&#39;,0);<br />                                }<br />                                else {<br />                                        // Flipped inverse.<br />                                        choose_filter(&#39;N&#39;,-1);<br />                                }<br />        <br />                                lp=MILP;Nl=Nilp;  <br />                                hp=MIHP;Nh=Nihp;<br /><br />                                // Inverse transform over columns.<br />                                ups_n_filt_all_cols(trf,dimi,dimj,lp,Nl,hp,Nh,levs-1-j,shift_arr_c);<br />                <br />                                dimi&lt;&lt;=1;<br />                                dimj&lt;&lt;=1;<br />                        }<br />                }<br />        }<br /><br />        // Initialize final result with zeros.<br />        im=allocate_2d_float(Ni,Nj,1);<br /><br />        // Choose Antonini.<br />        choose_filter(&#39;A&#39;,0);<br /><br />        lp=MILP;Nl=Nilp;  <br />        hp=MIHP;Nh=Nihp;<br /><br />        // Now the first level.<br />        for(i=0;i&lt;4;i++) {<br /><br />                // Set shifts as specified by Kingsbury&#39;s paper.<br />                if(i/2==0)<br />                        shift_arr_r[0]=1;<br />                else<br />                        shift_arr_r[0]=0;<br /><br />                if(i%2==0)<br />                        shift_arr_c[0]=1;<br />                else<br />                        shift_arr_c[0]=0;<br /><br />                // Inverse transform.<br />                wav2d_inpl(trf,Ni,Nj,1,lp,Nl,hp,Nh,0,shift_arr_r,shift_arr_c);<br /><br />                // Accumulate the results of 4x redundancy.<br />                for(k=0;k&lt;Ni;k++)<br />                        for(l=0;l&lt;Nj;l++)<br />                                im[k][l]+=trf[k][l];<br /><br />        }<br /><br />        // Normalize results by 4 to account for 4x redundancy accumulation.<br />        for(k=0;k&lt;Ni;k++)<br />                for(l=0;l&lt;Nj;l++)<br />                        im[k][l]/=4;<br /><br />        return(im);<br />}<br /><br /><br />// Forward complex wavelet packet transform.<br />// Ni, Nj multiples of 2^levs.<br />// levs&gt;=1.<br />//<br />// See complex_wav_forw() comments.<br />// See wavpack2d_inpl() comments for LL_ONLY_AFTER_LEV.<br />//<br />// Not fully tested. Please check with literature.<br />//<br />void complex_wav_pack_forw(float **im,float ***trf,int Ni,int Nj,int levs)<br /><br />{<br />        int i,j,k,l;<br />        int Nl,Nh,dimi,dimj,hdimi,hdimj;<br />        float *lp,*hp;<br />        int shift_arr_r[MAX_ARR_SIZE],shift_arr_c[MAX_ARR_SIZE];<br />        float tmp,**buffer;<br />        int p,q,rcnt,ccnt;<br /><br />        // Choose Antonini.<br />        choose_filter(&#39;A&#39;,0);<br /><br />        lp=MFLP;Nl=Nflp;  <br />        hp=MFHP;Nh=Nfhp;<br /><br />        // First level, fully overcomplete resulting 4x redundancy.<br />        // Results are in trf.<br />        for(i=0;i&lt;4;i++) {<br /><br />                for(k=0;k&lt;Ni;k++)<br />                        for(l=0;l&lt;Nj;l++)<br />                                trf[k][l]=im[k][l];<br /><br />                // Set shifts as specified by Kingsbury&#39;s paper.<br />                if(i/2==0)<br />                        shift_arr_r[0]=1;<br />                else<br />                        shift_arr_r[0]=0;<br /><br />                if(i%2==0)<br />                        shift_arr_c[0]=1;<br />                else<br />                        shift_arr_c[0]=0;<br /><br />                // Transform.<br />                wav2d_inpl(trf,Ni,Nj,1,lp,Nl,hp,Nh,1,shift_arr_r,shift_arr_c);<br />        }<br /><br />        // Now grow using Kingsbury&#39;s orthogonal bank.<br />        if(levs&gt;1) {<br /><br />                buffer=allocate_2d_float(Ni/2,Nj/2,0);<br /><br />                for(i=0;i&lt;4;i++) {<br /><br />                        dimi=Ni/2;<br />                        dimj=Nj/2;<br />                        for(j=1;j&lt;levs;j++) {<br /><br />                                // Number of row/column bands.<br />                                rcnt=Ni/dimi;<br />                                ccnt=Nj/dimj;<br /><br />                                if(j&gt;=LL_ONLY_AFTER_LEV) {<br />                                        // Grow wavelets only over LL band after LL_ONLY_AFTER_LEV.<br />                                        rcnt=ccnt=1;<br />                                }<br />        <br />                                for(p=0;p&lt;rcnt;p++)<br />                                        for(q=0;q&lt;ccnt;q++) {<br /><br />                                                // Copy data to buffer.<br />                                                for(k=0;k&lt;dimi;k++)<br />                                                        for(l=0;l&lt;dimj;l++)<br />                                                                buffer[k][l]=trf[p*dimi+k][q*dimj+l];<br />                                                <br />                                                if(i/2==0) {<br />                                                        // Regular orth. bank.<br />                                                        choose_filter(&#39;N&#39;,0);<br />                                                }<br />                                                else {<br />                                                        // Flipped orth. bank (see Kingsbury).<br />                                                        // Flipped is same as inverse.<br />                                                        choose_filter(&#39;N&#39;,-1);<br />                                                }<br />                                <br />                                                lp=MFLP;Nl=Nflp;  <br />                                                hp=MFHP;Nh=Nfhp;<br /><br />                                                // Transform over rows.<br />                                                filt_n_dec_all_rows(buffer,dimi,dimj,lp,Nl,hp,Nh);<br />                        <br />                                                if(i%2==0) {<br />                                                        // Regular.<br />                                                        choose_filter(&#39;N&#39;,0);<br />                                                }<br />                                                else {<br />                                                        // Flipped.<br />                                                        choose_filter(&#39;N&#39;,-1);<br />                                                }<br />                        <br />                                                lp=MFLP;Nl=Nflp;  <br />                                                hp=MFHP;Nh=Nfhp;<br /><br />                                                // Transform over columns.<br />                                                filt_n_dec_all_cols(buffer,dimi,dimj,lp,Nl,hp,Nh);<br /><br />                                                // Copy results to trf.<br />                                                for(k=0;k&lt;dimi;k++)<br />                                                        for(l=0;l&lt;dimj;l++)<br />                                                                trf[p*dimi+k][q*dimj+l]=buffer[k][l];<br />                                        }<br />                <br />                                dimi&gt;&gt;=1;<br />                                dimj&gt;&gt;=1;<br />                <br />                        }<br />                }<br />                free_2d_float(buffer,Ni/2);<br />        }<br /><br />        // Generate the complex wavelet coefficients.<br />        hdimi=Ni/(1&lt;&lt;levs);<br />        hdimj=Nj/(1&lt;&lt;levs);<br /><br />        for(k=0;k&lt;Ni;k++)<br />                for(l=0;l&lt;Nj;l++) {<br /><br />                        // After this computation the complex wavelet coefficients<br />                        // are given by trf[0]+jtrf[2] and trf[3]+jtrf[1];<br />                        tmp=trf[0][k][l]+trf[3][k][l];<br />                        trf[3][k][l]=trf[0][k][l]-trf[3][k][l];<br />                        trf[0][k][l]=tmp;<br /><br />                        tmp=trf[1][k][l]+trf[2][k][l];<br />                        trf[2][k][l]=trf[1][k][l]-trf[2][k][l];<br />                        trf[1][k][l]=tmp;<br />                }<br />}<br /><br />// Inverse complex wavelet packet transform.<br />// trf is modified in intermediate computations.<br />// Ni, Nj multiples of 2^levs<br />// levs&gt;=1.<br />//<br />// See complex_wav_pack_forw() comments.<br />//<br />float **complex_wav_pack_inv(float ***trf,int Ni,int Nj,int levs)<br /><br />{<br />        int i,j,k,l;<br />        int Nl,Nh,dimi,dimj,hdimi,hdimj;<br />        float *lp,*hp;<br />        int shift_arr_r[MAX_ARR_SIZE],shift_arr_c[MAX_ARR_SIZE];<br />        float tmp;<br />        float **im,**buffer;<br />        int p,q,rcnt,ccnt;<br /><br /><br />        // Clean the filter shift arrays.<br />        for(i=0;i&lt;1&lt;&lt;levs;i++)<br />                shift_arr_r=shift_arr_c=0;<br /><br />        // Get back the intermediate wavelet coefficients from the<br />        // complex wavelet coefficients.<br />        hdimi=Ni/(1&lt;&lt;levs);<br />        hdimj=Nj/(1&lt;&lt;levs);<br /><br />        for(k=0;k&lt;Ni;k++)<br />                for(l=0;l&lt;Nj;l++) {<br /><br />                        // Prior to this computation the complex wavelet coefficients<br />                        // are given by trf[0]+jtrf[2] and trf[3]+jtrf[1];<br />                        tmp=(trf[0][k][l]+trf[3][k][l])/2;<br />                        trf[3][k][l]=(trf[0][k][l]-trf[3][k][l])/2;<br />                        trf[0][k][l]=tmp;<br /><br />                        tmp=(trf[1][k][l]+trf[2][k][l])/2;<br />                        trf[2][k][l]=(trf[1][k][l]-trf[2][k][l])/2;<br />                        trf[1][k][l]=tmp;<br />                }<br /><br />        if(levs&gt;1) {<br /><br />                buffer=allocate_2d_float(Ni/2,Nj/2,0);<br />                for(i=0;i&lt;4;i++) {<br />        <br />                        dimi=Ni&gt;&gt;(levs-1);<br />                        dimj=Nj&gt;&gt;(levs-1);<br />        <br />                                <br />                        for(j=1;j&lt;levs;j++) {<br />        <br />                                // Number of row/column bands.<br />                                rcnt=Ni/dimi;<br />                                ccnt=Nj/dimj;<br /><br />                                if(j&gt;=LL_ONLY_AFTER_LEV) {<br />                                        // Grow wavelets only over LL band after LL_ONLY_AFTER_LEV.<br />                                        rcnt=ccnt=1;<br />                                }<br /><br />                                for(p=0;p&lt;rcnt;p++)<br />                                        for(q=0;q&lt;ccnt;q++) {<br /><br />                                                // Copy data to buffer.<br />                                                for(k=0;k&lt;dimi;k++)<br />                                                        for(l=0;l&lt;dimj;l++)<br />                                                                buffer[k][l]=trf[p*dimi+k][q*dimj+l];<br /><br />                                                if(i/2==0) {<br />                                                        // Regular inverse, it just happens that orth. inverses are flipped.<br />                                                        choose_filter(&#39;N&#39;,0);<br />                                                }<br />                                                else {<br />                                                        // Flipped inverse.<br />                                                        choose_filter(&#39;N&#39;,-1);<br />                                                }<br /><br />                                                lp=MILP;Nl=Nilp;  <br />                                                hp=MIHP;Nh=Nihp;<br /><br />                                                // Inverse transform over rows.<br />                                                ups_n_filt_all_rows(buffer,dimi,dimj,lp,Nl,hp,Nh,levs-1-j,shift_arr_r);<br />                                <br />                        <br />                                                if(i%2==0) {<br />                                                        // Regular inverse.<br />                                                        choose_filter(&#39;N&#39;,0);<br />                                                }<br />                                                else {<br />                                                        // Flipped inverse.<br />                                                        choose_filter(&#39;N&#39;,-1);<br />                                                }<br />                        <br />                                                lp=MILP;Nl=Nilp;  <br />                                                hp=MIHP;Nh=Nihp;<br /><br />                                                // Inverse transform over columns.<br />                                                ups_n_filt_all_cols(buffer,dimi,dimj,lp,Nl,hp,Nh,levs-1-j,shift_arr_c);<br /><br />                                                // Copy results to trf.<br />                                                for(k=0;k&lt;dimi;k++)<br />                                                        for(l=0;l&lt;dimj;l++)<br />                                                                trf[p*dimi+k][q*dimj+l]=buffer[k][l];<br />                                        }<br />                <br />                                dimi&lt;&lt;=1;<br />                                dimj&lt;&lt;=1;<br />                        }<br />                }<br /><br />                free_2d_float(buffer,Ni/2);<br />        }<br /><br />        // Initialize final result with zeros.<br />        im=allocate_2d_float(Ni,Nj,1);<br /><br />        // Choose Antonini.<br />        choose_filter(&#39;A&#39;,0);<br /><br />        lp=MILP;Nl=Nilp;  <br />        hp=MIHP;Nh=Nihp;<br /><br />        // Now the first level.<br />        for(i=0;i&lt;4;i++) {<br /><br />                // Set shifts as specified by Kingsbury&#39;s paper.<br />                if(i/2==0)<br />                        shift_arr_r[0]=1;<br />                else<br />                        shift_arr_r[0]=0;<br /><br />                if(i%2==0)<br />                        shift_arr_c[0]=1;<br />                else<br />                        shift_arr_c[0]=0;<br /><br />                // Inverse transform.<br />                wav2d_inpl(trf,Ni,Nj,1,lp,Nl,hp,Nh,0,shift_arr_r,shift_arr_c);<br /><br />                // Accumulate the results of 4x redundancy.<br />                for(k=0;k&lt;Ni;k++)<br />                        for(l=0;l&lt;Nj;l++)<br />                                im[k][l]+=trf[k][l];<br /><br />        }<br /><br />        // Normalize results by 4 to account for 4x redundancy accumulation.<br />        for(k=0;k&lt;Ni;k++)<br />                for(l=0;l&lt;Nj;l++)<br />                        im[k][l]/=4;<br /><br />        return(im);<br />}
回复 支持 反对

使用道具 举报

35#
 楼主| 发表于 17.6.2006 22:25:13 | 只看该作者
我实在看得不行了,这个是不是正宗的Wavelet Transformation?<br /><br />那个很多的,是不是很多多余的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点信息

站点统计| 举报| Archiver| 手机版| 小黑屋

Powered by Discuz! X3.2 © 2001-2014 Comsenz Inc.

GMT+1, 3.6.2024 00:21

关于我们|Apps

() 开元网

快速回复 返回顶部 返回列表