Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C KissFFT正向/反向输出噪声,为什么?_C_Fft_Kissfft - Fatal编程技术网

C KissFFT正向/反向输出噪声,为什么?

C KissFFT正向/反向输出噪声,为什么?,c,fft,kissfft,C,Fft,Kissfft,我试图在java应用程序中本机使用KissFFT,但输入信号的正向/反向并没有像它应该的那样返回:信号振幅几乎不存在。如果我去掉比例因子(除以2N),结果就是谐波噪声。有人能发现这个虫子吗 这是转发呼叫(复制自GDX,所以应该可以!) JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_spectrum(JNIEnv*env、jclass clazz、jlong handle、jshortArray obj_sa

我试图在java应用程序中本机使用KissFFT,但输入信号的正向/反向并没有像它应该的那样返回:信号振幅几乎不存在。如果我去掉比例因子(除以2N),结果就是谐波噪声。有人能发现这个虫子吗

这是转发呼叫(复制自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);
浮点*频谱=(浮点*)环境->GetPrimitiveArrayCritical(obj_频谱,0);
KissFFT*fft=(KissFFT*)句柄;
kiss_fftr(fft->forwardConfig,(kiss_fft_scalar*)采样,fft->频谱);
int len=fft->numSamples/2+1;
对于(int i=0;i频谱[i].r)*fft->numSamples;
浮点im=标度(fft->频谱[i].i)*fft->numSamples;
如果(i>0)
频谱[i]=sqrtf(re*re+im*im);
其他的
频谱[i]=sqrtf(re*re+im*im);
}
env->ReleasePrimitiveArrayCritical(对象样本,样本,0);
环境->释放原始阵列临界(obj_谱,谱,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);
//@电话:108
KissFFT*fft=(KissFFT*)句柄;
kiss_fft_cpx out[fft->numSamples];
kiss_fftri(fft->inverseConfig,fft->spectrum,(kiss_fft_scalar*)out);
对于(int i=0;inumSamples;i++){
短样本[i]=(out[i].r)/(fft->numSamples*2);
}
env->ReleasePrimitiveArrayCritical(obj_样本,shortSamples,0);
}
请参见类似问题

或从自述文件:

Q: Why don't I get the output I expect? A: The two most common causes of this are 1) scaling : is there a constant multiplier between what you got and what you want? 2) mixed build environment -- all code must be compiled with same preprocessor definitions for FIXED_POINT and kiss_fft_scalar 问:为什么我得不到我期望的结果? 答:最常见的两个原因是 1) 缩放:在你得到的和你想要的之间是否有一个恒定的乘数? 2) 混合构建环境——所有代码都必须使用相同的预处理器进行编译 固定点和kiss\u fft\u标量的定义 注意一个类似的问题

或从自述文件:

Q: Why don't I get the output I expect? A: The two most common causes of this are 1) scaling : is there a constant multiplier between what you got and what you want? 2) mixed build environment -- all code must be compiled with same preprocessor definitions for FIXED_POINT and kiss_fft_scalar 问:为什么我得不到我期望的结果? 答:最常见的两个原因是 1) 缩放:在你得到的和你想要的之间是否有一个恒定的乘数? 2) 混合构建环境——所有代码都必须使用相同的预处理器进行编译 固定点和kiss\u fft\u标量的定义
哎呀!发现了问题。我应该在短数组中进行逆变换:

kiss_fftri( fft->inverseConfig, fft->spectrum, shortSamples );

哎呀!发现了问题。我应该在短数组中进行逆变换:

kiss_fftri( fft->inverseConfig, fft->spectrum, shortSamples );

根据protectedmember的请求,这里有一个更完整的示例(无论如何,在本机端)。最后我稍微修改了libgdx代码(使用v.0.9.4)。我还使用浮点而不是固定值进行编译,因为后者在反转时引入了量化噪声。这段代码应该适用于这两种情况(因为kiss\u fft\u scalar根据编译器标志调整为short或float),但没有使用fixed重新测试,因为我发现它对fft->ifft系列不有用

我很想知道你是否成功,一定要让我知道

(请注意,此代码位于libgdx之后,属于Apache 2.0许可证之下!)

#包括
#包括
#包括
#包括
#包括
结构基斯夫特
{
亲吻(fftr),;
接吻(fftr)(cfg);
kiss_fft_cpx*频谱;
整数样本;
int频谱大小;
};
JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_create(JNIEnv*env,jclass clazz,jint numSamples){
KissFFT*fft=新的KissFFT();
fft->forwardConfig=kiss\u fftr\u alloc(numSamples,0,NULL,NULL);
fft->inverseConfig=kiss\u fftr\u alloc(numSamples,1,NULL,NULL);
fft->spectrum=(kiss\u fft\u cpx*)malloc(sizeof(kiss\u fft\u cpx)*numSamples);
fft->numSamples=numSamples;
fft->spectrumSize=numSamples/2+1;
返回(jlong)fft;
}
JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_destroy(JNIEnv*env,jclass clazz,jlong handle){
KissFFT*fft=(KissFFT*)句柄;
自由(fft->forwardConfig);
自由(fft->inverseConfig);
自由(fft->频谱);
自由(fft);
}
JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_spectrum(JNIEnv*env、jclass clazz、jlong handle、jfloatArray obj_样本、jfloatArray obj_mags){
kiss_fft_scalar*samples=(kiss_fft_scalar*)env->GetPrimitiveArrayCritical(obj_samples,0);
float*mags=(float*)env->GetPrimitiveArrayCritical(obj_mags,0);
KissFFT*fft=(KissFFT*)句柄;
kiss_fftr(fft->forwardConfig,采样,fft->spectrum);
for(int i=0;ispectrumSize;i++){
mags[i]=hypotf(fft->spectrum[i].r,fft->spectrum[i].i);
}
env->ReleasePrimitiveArrayCritical(对象样本,样本,0);
env->ReleasePrimitiveArrayCritical(对象杂志,杂志,0);
}
JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_Reverse(JNIEnv*env,jclass clazz,jlong handle,jfloatArray obj_示例){
kiss_fft_scalar*samples=(kiss_fft_scalar*)env->GetPrimitiveArrayCritical(obj_samples,0);
KissFFT*fft=(KissFFT*)句柄;
kiss_fftri(fft->inverseConfig,fft->spectrum,samples);
对于(int i=0;inumSamples;i++){
样本[i]=样本[i]/(浮点)fft->numSamples;
}
env->ReleasePrimitiveArrayCritical(对象样本,样本,0);
}

根据protectedmember的请求,这里有一个更完整的示例(无论如何,在本机端)。
#include <com.badlogic.gdx.audio.analysis.KissFFT.h>

#include <kissfft/kiss_fftr.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

struct KissFFT
{
    kiss_fftr_cfg forwardConfig;
    kiss_fftr_cfg inverseConfig;
    kiss_fft_cpx* spectrum;
    int numSamples;
    int spectrumSize;
};

JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_create(JNIEnv* env, jclass clazz, jint numSamples) {

    KissFFT* fft = new KissFFT();
    fft->forwardConfig = kiss_fftr_alloc(numSamples,0,NULL,NULL);
    fft->inverseConfig = kiss_fftr_alloc(numSamples,1,NULL,NULL);
    fft->spectrum = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * numSamples);
    fft->numSamples = numSamples;
    fft->spectrumSize = numSamples/2+1;
    return (jlong)fft;
}

JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_destroy(JNIEnv* env, jclass clazz, jlong handle) {

    KissFFT* fft = (KissFFT*)handle;
    free(fft->forwardConfig);
    free(fft->inverseConfig);
    free(fft->spectrum);
    free(fft);  
}

JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_spectrum(JNIEnv* env, jclass clazz, jlong handle, jfloatArray obj_samples, jfloatArray obj_mags) {

    kiss_fft_scalar* samples = (kiss_fft_scalar*)env->GetPrimitiveArrayCritical(obj_samples, 0);
    float* mags = (float*)env->GetPrimitiveArrayCritical(obj_mags, 0);

    KissFFT* fft = (KissFFT*) handle;

    kiss_fftr(fft->forwardConfig, samples, fft->spectrum);

    for(int i=0;i<fft->spectrumSize;i++) {
        mags[i] = hypotf(fft->spectrum[i].r,fft->spectrum[i].i);
    }

    env->ReleasePrimitiveArrayCritical(obj_samples, samples, 0);
    env->ReleasePrimitiveArrayCritical(obj_mags, mags, 0);
}

JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_inverse(JNIEnv* env, jclass clazz, jlong handle, jfloatArray obj_samples) {
    kiss_fft_scalar* samples = (kiss_fft_scalar*)env->GetPrimitiveArrayCritical(obj_samples, 0);

    KissFFT* fft = (KissFFT*)handle;

    kiss_fftri( fft->inverseConfig, fft->spectrum, samples );

    for(int i=0;i<fft->numSamples;i++) {
        samples[i] = samples[i] / (float)fft->numSamples;
    }

    env->ReleasePrimitiveArrayCritical(obj_samples, samples, 0);

}