<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic 2D wavelet transform with symmetric border extension in Intel® Integrated Performance Primitives</title>
    <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791269#M2406</link>
    <description>Hello again,&lt;BR /&gt;&lt;BR /&gt;I tried another test with symmetric extensions: actually, there are 2 ways to extend, lets say, the 1D signal {1,2,3,4} in a symmetric fashion. (1) {...3,2,1,1,2,3,4,4,3,2...}. (2) {...3,2,1,2,3,4,3,2...}.&lt;BR /&gt;I tries both ways with the 2D wavelet transform and could not reconstruct the image.&lt;BR /&gt;&lt;BR /&gt;hope you can help me, as this problem, and the compression performance that I get as a result, put my whole project with IPP wavelets in danger.&lt;BR /&gt;&lt;BR /&gt;thanks,&lt;BR /&gt;&lt;BR /&gt;Yoav</description>
    <pubDate>Thu, 11 Nov 2010 08:17:01 GMT</pubDate>
    <dc:creator>yoavnaveh</dc:creator>
    <dc:date>2010-11-11T08:17:01Z</dc:date>
    <item>
      <title>2D wavelet transform with symmetric border extension</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791268#M2405</link>
      <description>&lt;P&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;I'm using 2D wavelet transforms for image compression. for some reason, IPP does not have symmetric border extension, but only wrap-around border extension. this decrease the effectivness of the compression and creates a lot of non-zero coefficients. I've implemented a symmetric extension but it doesn't work - I can't reconstruct my image (forward and then inverse wavelet transforms differs from the original image).&lt;BR /&gt;below I've added both my symmetric extension function as well as a test code. in the test code, the wrap-around border extension calls are commented (if you un-comment them, you get the reconstruction).&lt;BR /&gt;&lt;BR /&gt;please help me, as this is crucial to my project.&lt;BR /&gt;&lt;BR /&gt;thanks,&lt;BR /&gt;&lt;BR /&gt;Yoav&lt;BR /&gt;&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;symmetric extension function:&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;bool CopySymmBorder_32f_C1R(const float* pSrc, int srcStep, IppiSize srcRoiSize, float* pDst, int dstStep, IppiSize dstRoiSize,&lt;BR /&gt; int topBorderHeight, int leftBorderWidth) {&lt;BR /&gt; // parameters consistency checks:&lt;BR /&gt; if (!pSrc || !pDst) return false;&lt;BR /&gt; int sizeofFloat = sizeof(float);&lt;BR /&gt; if (srcStep &amp;lt;= 0 || dstStep &amp;lt;= 0 || srcStep % sizeofFloat != 0 || dstStep % sizeofFloat != 0)&lt;BR /&gt;return false;&lt;BR /&gt; if (srcRoiSize.width &amp;lt;= 0 || srcRoiSize.height &amp;lt;= 0 || dstRoiSize.width &amp;lt;= 0 || dstRoiSize.height &amp;lt;= 0)&lt;BR /&gt;return false;&lt;BR /&gt; if (topBorderHeight &amp;lt; 0 || leftBorderWidth &amp;lt; 0)&lt;BR /&gt;return false;&lt;BR /&gt; if (dstRoiSize.width &amp;lt; srcRoiSize.width + leftBorderWidth)&lt;BR /&gt;return false;&lt;BR /&gt; if (dstRoiSize.height &amp;lt; srcRoiSize.height + topBorderHeight)&lt;BR /&gt;return false;&lt;/P&gt;&lt;P&gt; int rightBorderWidth = dstRoiSize.width - srcRoiSize.width - leftBorderWidth;&lt;BR /&gt; int botBorderHeight = dstRoiSize.height - srcRoiSize.height - topBorderHeight;&lt;/P&gt;&lt;P&gt; // copy &lt;PSRC&gt; into the appropriate position in &lt;PDST&gt;:&lt;BR /&gt; float* pCurrDst = pDst + topBorderHeight*dstStep/sizeofFloat + leftBorderWidth;&lt;BR /&gt; if (ippStsNoErr != ippiCopy_32f_C1R (pSrc, srcStep, pCurrDst, dstStep, srcRoiSize))&lt;BR /&gt;return false;&lt;/PDST&gt;&lt;/PSRC&gt;&lt;/P&gt;&lt;P&gt; bool needFurtherExtension = false;&lt;BR /&gt; const float* ps = NULL;&lt;BR /&gt; float* pd = NULL;&lt;BR /&gt; int N, M;&lt;BR /&gt; int i, j, ind;&lt;BR /&gt; int currTop, currBot, currLeft, currRight;&lt;/P&gt;&lt;P&gt; // extending the top border:&lt;BR /&gt; if (topBorderHeight &amp;gt; srcRoiSize.height) {&lt;BR /&gt;needFurtherExtension = true;&lt;BR /&gt;currTop = topBorderHeight &amp;gt; srcRoiSize.height;&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt;currTop = 0;&lt;BR /&gt; N = std::min(topBorderHeight, srcRoiSize.height);&lt;/P&gt;&lt;P&gt; for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt;pd = pDst + (N-i-1)*dstStep/sizeofFloat + leftBorderWidth;&lt;BR /&gt;ps = pSrc + i*srcStep/sizeofFloat;&lt;BR /&gt;memcpy (pd, ps, srcRoiSize.width*sizeofFloat);&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt; // extending the bottom border:&lt;BR /&gt; if (botBorderHeight &amp;gt; srcRoiSize.height) {&lt;BR /&gt;needFurtherExtension = true;&lt;BR /&gt;currBot = dstRoiSize.height - (botBorderHeight &amp;gt; srcRoiSize.height);&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt;currBot = dstRoiSize.height;&lt;BR /&gt; N = std::min(botBorderHeight, srcRoiSize.height);&lt;/P&gt;&lt;P&gt; for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt;pd = pDst + (i+topBorderHeight+srcRoiSize.height)*dstStep/sizeofFloat + leftBorderWidth;&lt;BR /&gt;ps = pSrc + (srcRoiSize.height-i-1)*srcStep/sizeofFloat;&lt;BR /&gt;memcpy (pd, ps, srcRoiSize.width*sizeofFloat);&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt; // extending left border:&lt;BR /&gt; if (leftBorderWidth &amp;gt; srcRoiSize.width) {&lt;BR /&gt;needFurtherExtension = true;&lt;BR /&gt;currLeft = leftBorderWidth - srcRoiSize.width;&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt;currLeft = 0;&lt;BR /&gt; M = std::min(leftBorderWidth, srcRoiSize.width);&lt;BR /&gt; N = srcRoiSize.height;&lt;/P&gt;&lt;P&gt; if (M &amp;gt; 0) {&lt;BR /&gt;ind = topBorderHeight*dstStep/sizeofFloat + leftBorderWidth;&lt;BR /&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt; ps = pSrc + i*srcStep/sizeofFloat;&lt;BR /&gt; for (j = 0; j &amp;lt; M; ++j) {&lt;BR /&gt;pDst[ind-j-1] = ps&lt;J&gt;;&lt;BR /&gt; }&lt;BR /&gt; ind += dstStep/sizeofFloat;&lt;BR /&gt;}&lt;/J&gt;&lt;/P&gt;&lt;P&gt;// extending the (top-left, bottom-left) diagonal regions: flipping the left border&lt;BR /&gt;N = std::min(topBorderHeight, srcRoiSize.height);&lt;BR /&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt; pd = pDst + (topBorderHeight-i-1)*dstStep/sizeofFloat;&lt;BR /&gt; ps = pDst + (topBorderHeight+i)*dstStep/sizeofFloat;&lt;BR /&gt; memcpy (pd, ps, M*sizeofFloat);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;N = std::min(botBorderHeight, srcRoiSize.height);&lt;BR /&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt; pd = pDst + (topBorderHeight+srcRoiSize.height+i)*dstStep/sizeofFloat;&lt;BR /&gt; ps = pDst + (topBorderHeight+srcRoiSize.height-i-1)*dstStep/sizeofFloat;&lt;BR /&gt; memcpy (pd, ps, M*sizeofFloat);&lt;BR /&gt;}&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt; // extending right border:&lt;BR /&gt; if (rightBorderWidth &amp;gt; srcRoiSize.width) {&lt;BR /&gt;needFurtherExtension = true;&lt;BR /&gt;currRight = dstRoiSize.width - (rightBorderWidth - srcRoiSize.width);&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt;currRight = dstRoiSize.width;&lt;BR /&gt; M = std::min(rightBorderWidth, srcRoiSize.width);&lt;BR /&gt; N = srcRoiSize.height;&lt;/P&gt;&lt;P&gt; if (M &amp;gt; 0) {&lt;BR /&gt;ind = topBorderHeight*dstStep/sizeofFloat + leftBorderWidth + srcRoiSize.width;&lt;BR /&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt; ps = pSrc + i*srcStep/sizeofFloat;&lt;BR /&gt; for (j = 0; j &amp;lt; M; ++j) {&lt;BR /&gt;pDst[ind+j] = ps[srcRoiSize.width-j-1];&lt;BR /&gt; }&lt;BR /&gt; ind += dstStep/sizeofFloat;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;// extending the (top-right, bottom-right) diagonal regions: flipping the right border&lt;BR /&gt;N = std::min(topBorderHeight, srcRoiSize.height);&lt;BR /&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt; pd = pDst + (topBorderHeight-i-1)*dstStep/sizeofFloat + leftBorderWidth + srcRoiSize.width;&lt;BR /&gt; ps = pDst + (topBorderHeight+i)*dstStep/sizeofFloat + leftBorderWidth + srcRoiSize.width;&lt;BR /&gt; memcpy (pd, ps, M*sizeofFloat);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;N = std::min(botBorderHeight, srcRoiSize.height);&lt;BR /&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;BR /&gt; pd = pDst + (topBorderHeight+srcRoiSize.height+i)*dstStep/sizeofFloat + leftBorderWidth + srcRoiSize.width;&lt;BR /&gt; ps = pDst + (topBorderHeight+srcRoiSize.height-i-1)*dstStep/sizeofFloat + leftBorderWidth + srcRoiSize.width;&lt;BR /&gt; memcpy (pd, ps, M*sizeofFloat);&lt;BR /&gt;}&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt; if (needFurtherExtension) {&lt;BR /&gt;//IppiSize middleRoi = {currRight - currLeft, currBot - currTop};&lt;BR /&gt;//if (ippStsNoErr != ippiCopyReplicateBorder_32f_C1IR (pDst, dstStep, middleRoi, dstRoiSize, currTop, currLeft))&lt;BR /&gt;// return false;&lt;BR /&gt;return false;&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt; return true;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;test code:&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;void main() {&lt;BR /&gt; IppiWTFwdSpec_32f_C1R* pSpec;&lt;BR /&gt; IppiWTInvSpec_32f_C1R* pSpecInv;&lt;/P&gt;&lt;P&gt; // Biorthogonal 4.4 (2) decomposition filters:&lt;BR /&gt; Ipp32f pTapsLowF[9] = { 0.02674875741080976, -0.01686411844287495, -0.07822326652898785, 0.2668641184428723, 0.6029490182363579, 0.2668641184428723, -0.07822326652898785, -0.01686411844287495, 0.02674875741080976};&lt;BR /&gt; int lenLowF = 9;&lt;BR /&gt; int anchorLowF = 4;&lt;BR /&gt; Ipp32f pTapsHighF[7] = {0.09127176311424948, -0.05754352622849957, -0.5912717631142470, 1.115087052456994, -0.5912717631142470, -0.05754352622849957, 0.09127176311424948};&lt;BR /&gt; int lenHighF = 7;&lt;BR /&gt; int anchorHighF = 4;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; Ipp32f pSrc[8*8] = { 0.0, 0.1, 0.0, 11.0, 11.9, 0.0, 0.0, 0.0,&lt;BR /&gt;0.0, 0.0, 0.222, 11.0, 11.9, 0.0, 0.0, 0.0,&lt;BR /&gt;0.0, 0.0, 0.0, 11.0, 11.0, 0.0, 0.0, 0.0,&lt;BR /&gt;11.0, 11.0, 11.0, 11.0, 11.0, 11.0, 11.0, 11.0,&lt;BR /&gt;11.0, 11.0, 11.0, 11.0, 11.0, 11.0, 11.0, 11.0,&lt;BR /&gt;0.0, 0.0, 7.8, 11.0, 11.0, 0.0, 0.0, 0.0,&lt;BR /&gt;0.0, 2.5, 0.0, 11.0, 11.0, 0.0, 0.0, 0.0,&lt;BR /&gt;7.8, 0.0, 0.0, 11.0, 11.0, 0.0, 0.0, 0.0};&lt;/P&gt;&lt;P&gt; // borders manipulations:&lt;BR /&gt; int leftBorderLow = lenLowF - 1 - anchorLowF; // 4&lt;BR /&gt; int leftBorderHigh = lenHighF - 1 - anchorHighF; // 2&lt;BR /&gt; int rightBorderLow = lenLowF - 2 - leftBorderLow; // 3&lt;BR /&gt; int rightBorderHigh = lenHighF - 2 - leftBorderHigh; // 3&lt;BR /&gt; int leftTopBorder = IPP_MAX(leftBorderLow, leftBorderHigh);&lt;BR /&gt; int rightBottomBorder = IPP_MAX(rightBorderLow, rightBorderHigh);&lt;/P&gt;&lt;P&gt; // allocation the buffer with borders:&lt;/P&gt;&lt;P&gt; int srcWidthWithBorders = 8 + leftTopBorder + rightBottomBorder;&lt;BR /&gt; int srcHeightWithBorders = 8 + leftTopBorder + rightBottomBorder;&lt;BR /&gt; int srcStepWBorder;&lt;BR /&gt; Ipp32f* pSrcB = ippiMalloc_32f_C1 (srcWidthWithBorders, srcHeightWithBorders, &amp;amp;srcStepWBorder); //ippsMalloc_32f(bufSize);&lt;/P&gt;&lt;P&gt; //Ipp32f pSrcB[9*9];&lt;BR /&gt; int srcStep = 8*sizeof(Ipp32f);&lt;BR /&gt; IppiSize roiSize = {8, 8};&lt;BR /&gt; //int srcStepB = srcWidthWithBorders*sizeof(Ipp32f);&lt;BR /&gt; IppiSize roiSizeB = {srcWidthWithBorders, srcHeightWithBorders};&lt;/P&gt;&lt;P&gt; Ipp32f pDetailXDst[4*4];&lt;BR /&gt; Ipp32f pDetailYDst[4*4];&lt;BR /&gt; Ipp32f pDetailXYDst[4*4];&lt;BR /&gt; Ipp32f pApproxDst[4*4];&lt;BR /&gt; IppiSize dstRoiSize = {4, 4};&lt;BR /&gt; Ipp8u* pBuffer;&lt;/P&gt;&lt;P&gt; int approxStep, detailXStep, detailYStep, detailXYStep;&lt;BR /&gt; approxStep = detailXStep = detailYStep = detailXYStep = 4*sizeof(Ipp32f);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; // adds border to the source image&lt;BR /&gt; //ippiCopyWrapBorder_32f_C1R(pSrc, srcStep, roiSize, pSrcB, srcStepWBorder, roiSizeB, leftTopBorder, leftTopBorder);&lt;BR /&gt; CopySymmBorder_32f_C1R (pSrc, srcStep, roiSize, pSrcB, srcStepWBorder, roiSizeB, leftTopBorder, leftTopBorder);&lt;BR /&gt;//----- performs forward wavelet transform&lt;BR /&gt; // (1) allocate the transform context &amp;amp; memory&lt;BR /&gt; ippiWTFwdInitAlloc_32f_C1R ( &amp;amp;pSpec, pTapsLowF, lenLowF, anchorLowF, pTapsHighF, lenHighF, anchorHighF);&lt;/P&gt;&lt;P&gt; // (2) allocate the auxiliary buffer&lt;BR /&gt; int bufSize;&lt;BR /&gt; ippiWTFwdGetBufSize_C1R(pSpec, &amp;amp;bufSize);&lt;BR /&gt; pBuffer = ippsMalloc_8u(bufSize);&lt;/P&gt;&lt;P&gt; // (3) perform the forward transform&lt;BR /&gt; int srcROIOffset = leftTopBorder * srcStepWBorder/4 + leftTopBorder;&lt;BR /&gt; if (ippiWTFwd_32f_C1R (pSrcB + srcROIOffset, srcStepWBorder, pApproxDst, approxStep, pDetailXDst,&lt;BR /&gt; detailXStep, pDetailYDst, detailYStep, pDetailXYDst, detailXYStep,&lt;BR /&gt; dstRoiSize, pSpec, pBuffer) != ippStsNoErr) {&lt;BR /&gt;printf("something's wrong in ippiWTFwd_32f_C1R");&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt; //------------------------------------&lt;/P&gt;&lt;P&gt; Ipp8u* pBufferInv;&lt;BR /&gt; Ipp32f pDstInv[8*8];&lt;BR /&gt; IppiSize roiInvSize = {4, 4};&lt;BR /&gt; int stepDstInv = 8*sizeof(Ipp32f);&lt;BR /&gt; int bufSizeInv;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; // Biorthogonal 4.4 (2) reconstruction filters:&lt;BR /&gt; Ipp32f pTapsLowI[7] = {-0.09127176311424948, -0.05754352622849957, 0.5912717631142470, 1.115087052456994, 0.5912717631142470, -0.05754352622849957, -0.09127176311424948};&lt;BR /&gt; int lenLowI = 7;&lt;BR /&gt; int anchorLowI = 3;&lt;BR /&gt; Ipp32f pTapsHighI[9] = {0.02674875741080976, 0.01686411844287495, -0.07822326652898785, -0.2668641184428723, 0.6029490182363579, -0.2668641184428723, -0.07822326652898785, 0.01686411844287495, 0.02674875741080976};&lt;BR /&gt; int lenHighI = 9;&lt;BR /&gt; int anchorHighI = 3;&lt;/P&gt;&lt;P&gt;  //----- performs inverse wavelet transform&lt;BR /&gt; // (1) allocate the transform context &amp;amp; memory&lt;BR /&gt; ippiWTInvInitAlloc_32f_C1R (&amp;amp;pSpecInv, pTapsLowI, lenLowI, anchorLowI, pTapsHighI, lenHighI, anchorHighI);&lt;/P&gt;&lt;P&gt; // (2) allocate the auxiliary buffer&lt;BR /&gt; ippiWTInvGetBufSize_C1R(pSpecInv, &amp;amp;bufSizeInv);&lt;BR /&gt; pBufferInv = ippsMalloc_8u(bufSizeInv);&lt;/P&gt;&lt;P&gt; // borders computation&lt;BR /&gt; leftBorderLow = (lenLowI - 1 - anchorLowI) / 2;&lt;BR /&gt; leftBorderHigh = (lenHighI - 1 - anchorHighI) / 2;&lt;BR /&gt; rightBorderLow = (anchorLowI + 1) / 2;&lt;BR /&gt; rightBorderHigh = (anchorHighI + 1) / 2;&lt;BR /&gt; int apprLeftBorder = leftBorderLow; // 1&lt;BR /&gt; int apprRightBorder = rightBorderLow;&lt;BR /&gt; int apprTopBorder = leftBorderLow; // 1&lt;BR /&gt; int apprBottomBorder = rightBorderLow;&lt;BR /&gt; int detxLeftBorder = leftBorderLow;&lt;BR /&gt; int detxRightBorder = rightBorderLow;&lt;BR /&gt; int detxTopBorder = leftBorderHigh; // 2&lt;BR /&gt; int detxBottomBorder = rightBorderHigh;&lt;BR /&gt; int detyLeftBorder = leftBorderHigh;&lt;BR /&gt; int detyRightBorder = rightBorderHigh;&lt;BR /&gt; int detyTopBorder = leftBorderLow; // 1&lt;BR /&gt; int detyBottomBorder = rightBorderLow;&lt;BR /&gt; int detxyLeftBorder = leftBorderHigh;&lt;BR /&gt; int detxyRightBorder = rightBorderHigh;&lt;BR /&gt; int detxyTopBorder = leftBorderHigh; // 2&lt;BR /&gt; int detxyBottomBorder = rightBorderHigh;&lt;/P&gt;&lt;P&gt; // allocate the approx image with borders&lt;BR /&gt; int appBStep;&lt;BR /&gt; IppiSize roiInvSizeBApp = {4 + apprLeftBorder + apprRightBorder, 4 + apprTopBorder + apprBottomBorder};&lt;BR /&gt; Ipp32f* pAppB = ippiMalloc_32f_C1 (4 + apprLeftBorder + apprRightBorder, 4 + apprTopBorder + apprBottomBorder, &amp;amp;appBStep);&lt;/P&gt;&lt;P&gt; //ippiCopyWrapBorder_32f_C1R (pApproxDst, approxStep, dstRoiSize, pAppB, appBStep, roiInvSizeBApp, apprTopBorder, apprLeftBorder);&lt;BR /&gt; CopySymmBorder_32f_C1R (pApproxDst, approxStep, dstRoiSize, pAppB, appBStep, roiInvSizeBApp, apprTopBorder, apprLeftBorder);&lt;BR /&gt;  // allocate the X-detail image with borders&lt;BR /&gt; int detXBStep;&lt;BR /&gt; IppiSize roiInvSizeBDetX = {4 + detxLeftBorder + detxRightBorder, 4 + detxTopBorder + detxBottomBorder};&lt;BR /&gt; Ipp32f* pXB = ippiMalloc_32f_C1 (4 + detxLeftBorder + detxRightBorder, 4 + detxTopBorder + detxBottomBorder, &amp;amp;detXBStep);&lt;/P&gt;&lt;P&gt; //ippiCopyWrapBorder_32f_C1R(pDetailXDst, detailXStep, dstRoiSize, pXB, detXBStep, roiInvSizeBDetX, detxTopBorder, detxLeftBorder);&lt;BR /&gt; CopySymmBorder_32f_C1R(pDetailXDst, detailXStep, dstRoiSize, pXB, detXBStep, roiInvSizeBDetX, detxTopBorder, detxLeftBorder);&lt;BR /&gt; &lt;/P&gt;&lt;P&gt; // allocate the Y-detail image with borders&lt;BR /&gt; int detYBStep;&lt;BR /&gt; IppiSize roiInvSizeBDetY = {4 + detyLeftBorder + detyRightBorder, 4 + detyTopBorder + detyBottomBorder};&lt;BR /&gt; Ipp32f* pYB = ippiMalloc_32f_C1 (4 + detyLeftBorder + detyRightBorder, 4 + detyTopBorder + detyBottomBorder, &amp;amp;detYBStep);&lt;/P&gt;&lt;P&gt;// ippiCopyWrapBorder_32f_C1R(pDetailYDst, detailYStep, dstRoiSize, pYB, detYBStep, roiInvSizeBDetY, detyTopBorder, detyLeftBorder);&lt;BR /&gt; CopySymmBorder_32f_C1R(pDetailYDst, detailYStep, dstRoiSize, pYB, detYBStep, roiInvSizeBDetY, detyTopBorder, detyLeftBorder);&lt;BR /&gt; &lt;/P&gt;&lt;P&gt; // allocate the XY-detail image with borders&lt;BR /&gt; int detXYBStep;&lt;BR /&gt; IppiSize roiInvSizeBDetXY = {4 + detxyLeftBorder + detxyRightBorder, 4 + detxyTopBorder + detxyBottomBorder};&lt;BR /&gt; Ipp32f* pXYB = ippiMalloc_32f_C1 (4 + detxyLeftBorder + detxyRightBorder, 4 + detxyTopBorder + detxyBottomBorder, &amp;amp;detXYBStep);&lt;/P&gt;&lt;P&gt;// ippiCopyWrapBorder_32f_C1R(pDetailXYDst, detailXYStep, dstRoiSize, pXYB, detXYBStep, roiInvSizeBDetXY, detxyTopBorder, detxyLeftBorder);&lt;BR /&gt; CopySymmBorder_32f_C1R(pDetailXYDst, detailXYStep, dstRoiSize, pXYB, detXYBStep, roiInvSizeBDetXY, detxyTopBorder, detxyLeftBorder);&lt;BR /&gt; &lt;/P&gt;&lt;P&gt; //performs inverse wavelet transform&lt;BR /&gt; if (ippiWTInv_32f_C1R(pAppB+apprTopBorder*(appBStep/4)+apprLeftBorder, appBStep,&lt;BR /&gt; pXB+detxTopBorder*(detXBStep/4)+detxLeftBorder, detXBStep,&lt;BR /&gt; pYB+detyTopBorder*(detYBStep/4)+detyLeftBorder, detYBStep,&lt;BR /&gt; pXYB+detxyTopBorder*(detXYBStep/4)+detxyLeftBorder, detXYBStep,&lt;BR /&gt; roiInvSize, pDstInv, stepDstInv, pSpecInv, pBufferInv) != ippStsNoErr) {&lt;BR /&gt;printf("something's wrong in ippiWTInv_32f_C1R");&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; // free context memory&lt;BR /&gt; ippiWTInvFree_32f_C1R (pSpecInv);&lt;BR /&gt; ippiWTFwdFree_32f_C1R (pSpec);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;</description>
      <pubDate>Tue, 09 Nov 2010 15:52:57 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791268#M2405</guid>
      <dc:creator>yoavnaveh</dc:creator>
      <dc:date>2010-11-09T15:52:57Z</dc:date>
    </item>
    <item>
      <title>2D wavelet transform with symmetric border extension</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791269#M2406</link>
      <description>Hello again,&lt;BR /&gt;&lt;BR /&gt;I tried another test with symmetric extensions: actually, there are 2 ways to extend, lets say, the 1D signal {1,2,3,4} in a symmetric fashion. (1) {...3,2,1,1,2,3,4,4,3,2...}. (2) {...3,2,1,2,3,4,3,2...}.&lt;BR /&gt;I tries both ways with the 2D wavelet transform and could not reconstruct the image.&lt;BR /&gt;&lt;BR /&gt;hope you can help me, as this problem, and the compression performance that I get as a result, put my whole project with IPP wavelets in danger.&lt;BR /&gt;&lt;BR /&gt;thanks,&lt;BR /&gt;&lt;BR /&gt;Yoav</description>
      <pubDate>Thu, 11 Nov 2010 08:17:01 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791269#M2406</guid>
      <dc:creator>yoavnaveh</dc:creator>
      <dc:date>2010-11-11T08:17:01Z</dc:date>
    </item>
    <item>
      <title>2D wavelet transform with symmetric border extension</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791270#M2407</link>
      <description>&lt;P&gt;Yoav &lt;/P&gt;&lt;P&gt;I read the paper here: &lt;/P&gt;&lt;P&gt;&lt;A href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.99.3753&amp;amp;rep=rep1&amp;amp;type=pdf" target="_blank"&gt;http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.99.3753&amp;amp;rep=rep1&amp;amp;type=pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;2.3.3 part on Symmetric extension. &lt;/P&gt;&lt;P&gt;For Symmetric extension, it does not just simply use 1) , or 2) method. For low frequency part, and high frequency part, it need to combine 1) and 2) extension in different cases. &lt;/P&gt;&lt;P&gt;Based on that paper, I created an example code. It looks to be working here. See attached. &lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Thanks,&lt;BR /&gt;Chao &lt;/P&gt;</description>
      <pubDate>Fri, 12 Nov 2010 07:28:05 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791270#M2407</guid>
      <dc:creator>Chao_Y_Intel</dc:creator>
      <dc:date>2010-11-12T07:28:05Z</dc:date>
    </item>
    <item>
      <title>2D wavelet transform with symmetric border extension</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791271#M2408</link>
      <description>Hello Chao,&lt;BR /&gt;&lt;BR /&gt;thank you very much for taking the time and effort to takle (and solve) my problem. I read the paper you refered me to, looked at your implementation, implemented it in my code and it worked on the first run!!&lt;BR /&gt;&lt;BR /&gt;As you can see, this was not a trivial problem, and I would have had to work very hard in order to solve it by myself. Your help was invaluable and I thank you again for doing a great job.&lt;BR /&gt;&lt;BR /&gt;Yoav</description>
      <pubDate>Sun, 14 Nov 2010 15:45:02 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791271#M2408</guid>
      <dc:creator>yoavnaveh</dc:creator>
      <dc:date>2010-11-14T15:45:02Z</dc:date>
    </item>
    <item>
      <title>2D wavelet transform with symmetric border extension</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791272#M2409</link>
      <description>&lt;BR /&gt;&lt;P&gt;Yoav, &lt;/P&gt;&lt;P&gt;You are welcome. Feel free to share your questions or suggestion on using IPP. &lt;/P&gt;&lt;P&gt;thanks,&lt;BR /&gt;Chao&lt;/P&gt;</description>
      <pubDate>Mon, 15 Nov 2010 02:08:45 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791272#M2409</guid>
      <dc:creator>Chao_Y_Intel</dc:creator>
      <dc:date>2010-11-15T02:08:45Z</dc:date>
    </item>
    <item>
      <title>Hi Yoav and Chao, </title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791273#M2410</link>
      <description>&lt;P&gt;Hi Yoav and Chao,&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have exactly the same problem. Unfortunately, the example source code Chao provided is not available any more. Would it be possible to repost it?&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Fri, 26 Apr 2019 11:51:57 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/2D-wavelet-transform-with-symmetric-border-extension/m-p/791273#M2410</guid>
      <dc:creator>Le_Guelvouit__Gaëtan</dc:creator>
      <dc:date>2019-04-26T11:51:57Z</dc:date>
    </item>
  </channel>
</rss>

