[問題] Block convolution中的overlap-add

看板C_and_CPP (C/C++)作者 (我受傷了)時間14年前 (2011/11/11 20:03), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
開發平台(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)
文章代碼(AID): #1ElGyOt9 (C_and_CPP)
文章代碼(AID): #1ElGyOt9 (C_and_CPP)