EmptyProjectを使う その13 2.Overlap-add 法とは? } else } } 「この関数 get_CaptureData_FFT_result の定義は、こうなっています。 //FFTの準備 } 」 if(tune>=0) for(i=0;i<span;i++)//i=5
under 117Hz
cut DATA->myfir->get_data_from_mulit_FFT_result(DATA->result,4096,DATA->output, //overlap-add
method //save current
output
左: FFT結果を切り取る。filter無し 右: FFT結果を切り取る。filter有り
1.この差は 大きい
前節では、FFT結果を並べ替えて、必要な部分のみを、切り取って、逆FFTしました。
いい線いってるのですが、雑音が気になります。
送信時のモニターに、如何でしょう?
なんせ、filterを通してませんので、その分の遅延が、ありません。
例えば、96KHz sampling時でしたら、fir
filter
による遅延は、
FFTが4096個で、captureしたdata数が2048個で、filterの次数も、2048 だとすると、
overlap-save法では
1/96000 *2048
=
21ms位の遅延
に、なりましょうか....これは、大きい遅延です。
やっと、資料を、みつけました。
The
Scientist and Engineer's Guide to Digital Signal
Processing chapter18 By Steven W. Smith,
Ph.D.
以前も、お世話になったPDFです。 Dr.Steven W. Smith
さん、いつも、ありがとうございます。
以前、私が使った overlap-save法との違いは
overlap-save法 = captureしたデータを、overlapする。
overlap-add法 = outputされたデータを、overlapする。
プログラミング上では、
overlap-save 法
if(DATA->is_overlap_Lower) //simplified
double buffer for overlap save
method
{
for(i=0;i<2048;i++)
{
DATA->my_data_Q[i]
=DATA->my_data_Q[i+DATA->bank2]=DATA->current_Q[i];
DATA->my_data_I[i]
=DATA->my_data_I[i+DATA->bank2]=DATA->current_I[i];
}
DATA->myfir->get_CaptureData_FFT_result(
&DATA->my_data_Q[DATA->bank1],&DATA->my_data_I[DATA->bank1],4096,DATA->capture_fft,work,ip,w);
{
for(i=0;i<2048;i++)
{
DATA->my_data_Q[i+DATA->bank1]
=DATA->my_data_Q[i+DATA->bank3]=DATA->current_Q[i];
DATA->my_data_I[i+DATA->bank1]
=DATA->my_data_I[i+DATA->bank3]=DATA->current_I[i];
DATA->myfir->get_CaptureData_FFT_result(
&DATA->my_data_Q[DATA->bank2],&DATA->my_data_I[DATA->bank2],4096,DATA->capture_fft,work,ip,w);
..........
overlap-add 法
//FFT
data_origin.myfir->get_CaptureData_FFT_result(DATA->current_Q,DATA->current_I,2048,DATA->result,work,ip,w);
void
CFir::get_CaptureData_FFT_result(double* capture_data1,double*
capture_data2,int length,double*
dest,
double* work,int* ip,double*
w)
{
int i;
for(i=0;i<length;i++)
{
dest[2*i]
=capture_data1[i];//Q
dest[2*i+1]=capture_data2[i];//I
}
for(
;i < number_of_spectrum;i++ )
dest[2*i] =
dest[2*i+1] =0.0;
//do
FFT
cdft(2*number_of_spectrum,-1,dest,ip,w); //大浦さんのcdft
//ここで、tuneで、周波数遷移する
//DATA->capture_fft
の一部分だけを変化して同調する
span幅だけ、0Hzへ copyする
switch(DATA->info_array[selected_mode].usb)
{
case
0:
{
if(
tune>span )
{
{
.................
}
DATA->myfir->multi_FFT_results(DATA->coef_fft,DATA->capture_fft,DATA->result,4096);
DATA->info_array[selected_mode].usb,ip,w);
for(i=0;i<2048;i++)
DATA->output[i]
+=DATA->out2[i];
for(i=2048;i<4096;i++)
DATA->out2[i-2048]=DATA->output[i];
それから、CPU's
performanceも、現在の所、素晴らしいです。
最後に、overlap-add法を使った復調を 聞いて下さい。
いつも、素晴らしいvoiceを、お聞かせ下さるOMに、感謝致します m(__)m
H.19.9.21