자바 응용 프로그램에서 KissFFT를 기본적으로 사용하려고하지만 입력 신호의 정방향/역방향 신호가 반환되지 않습니다. 신호 진폭은 거의 존재하지 않습니다. 스케일링 팩터를 2N으로 나눈 값을 제거하면 고조파 노이즈가 발생합니다. 누구든지 버그를 발견 할 수 있습니까? 여기 KissFFT 정방향/역방향 출력에서 잡음이 출력되는 이유는 무엇입니까?
는 앞으로 호출입니다 (! GDX에서 복사, 그래서 확인을해야) :JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_spectrum(JNIEnv* env, jclass clazz, jlong handle, jshortArray obj_samples, jfloatArray obj_spectrum) {
short* samples = (short*)env->GetPrimitiveArrayCritical(obj_samples, 0);
float* spectrum = (float*)env->GetPrimitiveArrayCritical(obj_spectrum, 0);
KissFFT* fft = (KissFFT*)handle;
kiss_fftr(fft->forwardConfig, (kiss_fft_scalar*)samples, fft->spectrum);
int len = fft->numSamples/2 + 1;
for(int i = 0; i < len; i++)
{
float re = scale(fft->spectrum[i].r) * fft->numSamples;
float im = scale(fft->spectrum[i].i) * fft->numSamples;
if(i > 0)
spectrum[i] = sqrtf(re*re + im*im);
else
spectrum[i] = sqrtf(re*re + im*im);
}
env->ReleasePrimitiveArrayCritical(obj_samples, samples, 0);
env->ReleasePrimitiveArrayCritical(obj_spectrum, spectrum, 0);
}
그리고 여기에 역입니다 (내가 쓴, 아마 오류가 있습니다;)) :
JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_inverse(JNIEnv* env, jclass clazz, jlong handle, jshortArray obj_samples) {
short* shortSamples = (short*)env->GetPrimitiveArrayCritical(obj_samples, 0);
//@line:108
KissFFT* fft = (KissFFT*)handle;
kiss_fft_cpx out[fft->numSamples];
kiss_fftri(fft->inverseConfig, fft->spectrum, (kiss_fft_scalar*)out);
for (int i=0; i < fft->numSamples; i++) {
shortSamples[i] = (out[i].r)/(fft->numSamples*2);
}
env->ReleasePrimitiveArrayCritical(obj_samples, shortSamples, 0);
}
감사합니다 마크, 문제를 해결 (!이 코드는, libgdx 다음, 아파치 2.0 라이센스하에 있습니다)하지만 스케일링 팁도 도움이되었다! – cmbryan