[問題] Block convolution中的overlap-add
開發平台(Platform):
VC++ & VST (Ex: VC++, GCC, Linux, ...
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
有一段for loop的程式碼 我該放在哪裡?
餵入的資料(Input):
一個音框長度為L 因為要作overlap add所以一次給兩個音框
預期的正確結果(Expected Output):
做完overlap add輸出音訊應該無音爆
錯誤結果(Wrong Output):
仍聽得到音框與框間的音爆
程式碼(Code):
L = sampleFrames;//每個輸入音框的長度
M = 200; //FIR的長度
order=M-1;//FIR的階數
np=L+M-1;//音框與FIR濾波器作convolution後的總長度 所以假設音框的長度
//為L FIR濾波器長度為M 折積後的output長度L+M-1
//其中後面M-1個samples(存在L_last)須與下一個音框的
//前面M-1個samples(存在L_now)作相加
//此段為上一個音框折積過後 後面M-1個samples(h_L_SP1為FIR濾波器 SP1為input音框)
for (i=L;i<np;i++)
{
L_last[i-L]=0.0;
for (j=0;j<np-i;j++)
L_last[i-L]=L_last[i-L]+h_L_SP1[M-1-j]*SP1[i+j+1-M];
}
L_last[199]=0;//下一音框的第兩百個sample不須overlap add
//此段為現在這個音框折積過後 前面M個samples
for (i=0;i<order+1;i++)
{
L_now[i]=0.0;
for (j=0;j<i+1;j++)
{
L_now[i]=(L_now[i]+h_L_SP1[j]*SP1[i-j+L]);
}
}
//此段為現在這個音框折積過後 第M+1個sample至第L個sample
for (i=order+1;i<L;i++)
{
output[i]=0.0;
for (j=0;j<order+1;j++)
output[i]=output[i]+h_L_SP1[j]*SP1[i-j+L];
}
補充說明(Supplement):
其實問題點只在於我已經將計算前面M個output所需的加數和被加數存放在L_lsat和L_now
只差我不知道要把相加結果(以下程式碼)插入哪裡?
for (ii=0;ii<order+1;ii++)
output[ii]=L_now[ii]+L_last[ii];
由於之前一直使用Matlab 所以對於C++執行程的式順序順序不熟 請各位鞭小力點
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 147.188.254.145
※ 編輯: vpyao 來自: 147.188.254.145 (11/11 20:05)
※ 編輯: vpyao 來自: 147.188.254.145 (11/11 20:07)
※ 編輯: vpyao 來自: 147.188.254.145 (11/11 20:07)
※ 編輯: vpyao 來自: 147.188.254.145 (11/11 20:08)
※ 編輯: vpyao 來自: 147.188.254.145 (11/11 20:09)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章