https://blog.youkuaiyun.com/ebowtang/article/details/40433861#comments
之前通过学习上面链接的博客时,在实践中发现用小波变换处理一个5分钟左右的音频半小时都运行不不出来。因为上链接博主做验证是用了8个点做实验,所以看不出运行时间的差异。
经过对代码的调试,发现其IDWT代码时间复杂度很高(实际上IDWT应与DWT复杂度相同,但由于他代码的写法,导致了时间复杂度都不是一个数量级)于是自己做了改进。
改进后运行一个5分左右的音频文件只需要10秒左右 。IDWT代码如下
注: 改进思路就是小波分解重构公式。就是上链接里的一些分析图。不得不说他的图做得很好,对我的理解有很大帮助!!
// 一维小波反变换,重构出源信号
void CWavelet::IDWT(
double *pSrcCoef,//源分解系数
int dstLen,//重构出来的系数的长度
double *pDstData//重构出来的系数
)
{
int p = 0;
int caLen = (dstLen + m_dbFilter.filterLen - 1) / 2;
int k=0,flag=1;//flag 标志位
for (int i = 0; i < dstLen; i++)
{
pDstData[i] = 0.0;
if(i%2==0 && i!=0) k++;
if(flag==1){
flag=0;
for(int j=2,c=0;j>=0;j=j-2,c++){
pDstData[i]+=m_dbFilter.Lo_R[j] * pSrcCoef[k+c] + m_dbFilter.Hi_R[j] * pSrcCoef[k + c + caLen];
}
}else{
flag=1;
for(int j=3,c=0;j>=0;j=j-2,c++){
pDstData[i] += m_dbFilter.Lo_R[j] * pSrcCoef[k + c] + m_dbFilter.Hi_R[j] * pSrcCoef[k + c + caLen];
}
}
}
}