1

STFTでvDSP関数を使用する方法を理解しようとしています。だから私はアップルのexpamlesからFFTコードを使用し、最初の1024フレームのFFTを取得できますが、ファイルの終わりまで、次の1024〜2047フレームなどのFFTを取得するにはどうすればよいですか?(この場合、ファイルのサイズを想像しますはintf= 10000)です。

//vDSP variables
DOUBLE_COMPLEX_SPLIT A;
FFTSetupD setupReal;
uint32_t log2n;
uint32_t n, nOver2;
int32_t  stride;
double *obtainedReal;
double   scale;

log2n = N;
n = 1 << log2n;

stride = 1;
nOver2 = n/2;

int f = 10000;

buffer = malloc(f *sizeof(double));
obtainedReal = malloc(f *sizeof(double));
A.realp = malloc(f *sizeof(double));
A.imagp = malloc(f *sizeof(double));

vDSP_ctozD((DOUBLE_COMPLEX*) buffer, 2, &A, 1, nOver2);
setupReal = vDSP_create_fftsetupD(log2n, FFT_RADIX2);

if (setupReal == NULL) {
    NSLog(@"fft_setup failed to allocate enough memory for real FFT\n");
return 0 ;
    }

vDSP_fft_zripD(setupReal, &A, stride, log2n, FFT_FORWARD);

scale = (double) 1.0 / (2 * n);

vDSP_vsmulD(A.realp, 1, &scale, A.realp, 1, nOver2);
        vDSP_vsmulD(A.imagp, 1, &scale, A.imagp, 1, nOver2);

vDSP_ztocD(&A, 1, (DOUBLE_COMPLEX *) obtainedReal, 2, nOver2);
4

1 に答える 1

1

次の1024要素のFFTが必要な場合は、nOver2をA.realpとA.imagpに追加してから、別のvDSP_fft_zripDと別のvDSP_ztocDを実行します。おそらくgettainedRealも進めたいと思うでしょう。さもないと、新しい結果が古い結果を上書きします。

A.realpとA.imagpを変更すると開始アドレスが失われるため、A.realpとA.imagpを変更する前に開始アドレスを再計算するか、他の場所に保存しない限り、このメモリを解放できないことに注意してください。

また、10,000は1024の整数倍ではないため、最後の部分には1024要素が含まれないため、より多くのデータを取得したり、データにゼロを埋め込んだりするなど、別の方法を見つける必要があります。

A.realpとA.imagpに割り当てているメモリが多すぎます。それらのそれぞれはバッファ内の要素の半分を受け取るので、それらのそれぞれは半分のメモリしか必要としません。

それだけのメモリは必要ありません。vDSP_ctozDを使用して1024要素のみをA.realpとA.imagp(それぞれ512)に移動し、FFTを実行してから、vDSP_ztocDを使用してデータをgettainedRealに移動し、vDSP_ctozDを使用して次のグループに移動して1024を新しく移動できます。以前に使用されたA.realpとA.imagpの同じスペースへの要素。

于 2012-07-13T14:35:45.307 に答える