音声フォルマントの検出に使用するケプストラムを生成し、iPhone Accelerate フレームワークを使用してコーディングする方法に関する記事をフォローしています。ただし、結果は記事が期待するほどではありません。無声セクション (記事の図 3) では、最初のいくつかのビンでより小さい値が示されます。ただし、私のコードを実行すると、無声セクションの値が (1.0 に近づくほど) 大きくなり、有声セクションのように見えます。
これが私のコードです:
// copy buffer data into a separate array and apply hamming window
// don't use leadlength because we copied to beginning of buffer
int offset = (int)(s * stepSize);
float *hamBuffer = malloc(n*sizeof(float));
for (int i=0; i < n; i++)
hamBuffer[i] = hpBuffer[offset+i] * ((1.0f-0.46f) - 0.46f*cos(TWOPI*i/((float)n-1.0f)));
// configure float array into acceptable input array format (interleaved)
vDSP_ctoz((COMPLEX*)hamBuffer, 2, &complexArray, 1, halfN);
// free ham buffer
free(hamBuffer);
// run FFT
vDSP_fft_zrip(setupReal, &complexArray, stride, log2n, FFT_FORWARD);
// Absolute square (equivalent to mag^2)
complexArray.imagp[0] = 0.0f;
vDSP_zvmags(&complexArray, 1, complexArray.realp, 1, halfN);
bzero(complexArray.imagp, (halfN) * sizeof(float));
// scale
float scale = 1.0f / (2.0f*(float)n);
vDSP_vsmul(complexArray.realp, 1, &scale, complexArray.realp, 1, halfN);
// get log of absolute values for passing to inverse FFT for cepstrum
float *logmag = malloc(sizeof(float)*halfN);
for (int i=0; i < halfN; i++)
logmag[i] = log10f(fabsf(complexArray.realp[i]));
// configure float array into acceptable input array format (interleaved)
vDSP_ctoz((COMPLEX*)logmag, 2, &complexArray, 1, halfN/2);
// create cepstrum
vDSP_fft_zrip(setupReal, &complexArray, stride, log2n-1, FFT_INVERSE);
// scale again
scale = (float) 1.0 / (2 * n);
vDSP_vsmul(complexArray.realp, 1, &scale, complexArray.realp, 1, halfN);
vDSP_vsmul(complexArray.imagp, 1, &scale, complexArray.imagp, 1, halfN);
//convert interleaved to real
float *displayData = malloc(sizeof(float)*n);
vDSP_ztoc(&complexArray, 1, (COMPLEX*)displayData, 2, halfN);
// print cepstrum to debug window
for (int i=0; i < halfN; i++)
printf("%f\r\n", displayData[i]);
最初のいくつかのビンの結果は次のとおりです。
-1.036735
0.807992
-0.030310
0.201064
-0.048442
0.071084
-0.050529
0.108412
-0.037282
0.080372
-0.003775
0.102596
-0.027706
0.044470
0.010319
0.041597
-0.050533
0.012725
-0.003895
-0.016887
-0.010547
それらはゼロに向かって「落ち着き」ますが、最初のいくつかの数字は、私が無声セクションに期待していたよりもはるかに大きくなっています. 私のコードは間違っているように見えますか? 記事をかなり忠実にフォローしたと思います。無声セクションの最初のいくつかのビンでこのような大きな値が得られるのはなぜですか?