Gcc Kissfftr不同结果x86-Atheros AR9331

Gcc Kissfftr不同结果x86-Atheros AR9331,gcc,openwrt,kissfft,Gcc,Openwrt,Kissfft,这是我关于stackoverflow的第一个问题,不幸的是我的英语很差。但是我想试试 定制的kissfft twotonetest例程会产生两个不同的系统,结果非常不同 在x86上用gcc翻译的UnderUbuntu程序带来了正确的值。为Arduino YUN(Atheros AR9331)程序翻译的openWRT SDK显示的值不正确​​. 似乎因为不动点的定义被忽略了 定义为: #define FIXED_POINT 32 职能: double GetFreqBuf( tBuf * io_

这是我关于stackoverflow的第一个问题,不幸的是我的英语很差。但是我想试试

定制的kissfft twotonetest例程会产生两个不同的系统,结果非常不同

在x86上用gcc翻译的UnderUbuntu程序带来了正确的值。为Arduino YUN(Atheros AR9331)程序翻译的openWRT SDK显示的值不正确​​. 似乎因为不动点的定义被忽略了

定义为:

#define FIXED_POINT 32
职能:

double GetFreqBuf( tBuf * io_pBuf, int nfft)
{
    kiss_fftr_cfg cfg   = NULL;
    kiss_fft_cpx *kout  = NULL;
    kiss_fft_scalar *tbuf = NULL;
    uint32_t ptr;
    int i;
    double sigpow=0;
    double noisepow=0;
    long maxrange = SHRT_MAX;

    cfg = kiss_fftr_alloc(nfft , 0, NULL, NULL);
    tbuf    = KISS_FFT_MALLOC(nfft * sizeof(kiss_fft_scalar));
    kout    = KISS_FFT_MALLOC(nfft * sizeof(kiss_fft_cpx));

    /* generate the array from samples*/
    for (i = 0; i < nfft; i++) {

        //nur einen Kanal, eine Krücke, würde nun auch mit 2 kanälen gehen, aber so ist schneller
        if (io_pBuf->IndexNextValue >= (i*2))
            ptr = io_pBuf->IndexNextValue - (i*2);
        else
            ptr = io_pBuf->bufSize  - ((i*2) - io_pBuf->IndexNextValue);
         tbuf[i] = io_pBuf->aData[ptr] ;
    }

    kiss_fftr(cfg, tbuf, kout);

    for (i=0;i < (nfft/2+1);++i) {
        double tmpr = (double)kout[i].r / (double)maxrange;
        double tmpi = (double)kout[i].i / (double)maxrange;
        double mag2 = tmpr*tmpr + tmpi*tmpi;
        if (i!=0 && i!= nfft/2)
            mag2 *= 2; /* all bins except DC and Nyquist have symmetric counterparts implied*/

        /* if there is power between the frq's, it is signal, otherwise noise*/
        if ( i > nfft/96 && i < nfft/32 )
            noisepow += mag2;
        else
            sigpow += mag2;
    }

    kiss_fft_cleanup();
    //printf("TEST %d Werte, noisepow: %f sigpow: %f noise @ %fdB\n",nfft,noisepow,sigpow,10*log10(noisepow/sigpow +1e-30) );
   free(cfg);
   free(tbuf);
   free(kout);
    return 10*log10(noisepow/sigpow +1e-30);
}
double GetFreqBuf(tBuf*io_pBuf,int-nfft)
{
kiss_fftr_cfg cfg=NULL;
kiss_fft_cpx*kout=NULL;
kiss_fft_scalar*tbuf=NULL;
uint32_t ptr;
int i;
双sigpow=0;
双噪波=0;
长最大范围=短程最大值;
cfg=kiss_fftr_alloc(nfft,0,NULL,NULL);
tbuf=KISS_FFT_MALLOC(nfft*sizeof(KISS_FFT_标量));
kout=KISS_FFT_MALLOC(nfft*sizeof(KISS_FFT_cpx));
/*从样本生成数组*/
对于(i=0;iIndexNextValue>=(i*2))
ptr=io_pBuf->IndexNextValue-(i*2);
其他的
ptr=io_pBuf->bufSize-((i*2)-io_pBuf->IndexNextValue);
tbuf[i]=io_pBuf->aData[ptr];
}
kiss_fftr(cfg、tbuf、kout);
对于(i=0;i<(nfft/2+1);+i){
双tmpr=(双)kout[i].r/(双)最大范围;
double tmpi=(double)kout[i].i/(double)maxrange;
双磁极=tmpr*tmpr+tmpi*tmpi;
如果(i!=0&&i!=nfft/2)
mag2*=2;/*除DC和Nyquist外,所有BIN都具有对称对应项*/
/*如果frq之间有电源,则为信号,否则为噪声*/
如果(i>nfft/96&&i
可以使用同一文件中的16位声音样本作为输入。结果不同,例如从-3dB到-15dB。A您可以从哪里开始故障排除?

可能性1(最有可能)

编译kissfft.c或kiss_fftr.c与调用代码不同。很多人都会这样

强制相同固定点的一种简单方法是直接编辑kiss_fft.h。另一个选项:使用一些printf调试进行验证。i、 e.在不同的地方放置以下物品:

printf( __FILE__ " sees sizeof(kiss_fft_scalar)=%d\n" , sizeof(kiss_fft_scalar) )
可能性#2

也许FIXED_POINT=16代码可以工作,但FIXED_POINT=32代码不能工作,因为在kissfft内部或平台上处理不正确。32位固定代码依赖于int64\t的正确实现

那是16位处理器吗?我知道kissfft已经在16位平台上成功使用,但我不确定是否在16位固定点上使用了FIXED_POINT=32实FFT

维尔·格鲁克,
Mark

现在我定义为固定点16(对于16位声音ok),结果相同。。。vg Jense实际原因可能是我在上面的代码中看到的一个固定的数据类型分配,当我写这篇文章并更正。。。tbuf[i]=(双)io_pBuf->aData[ptr];正确的tbuf[i]=io_pBuf->aData[ptr];丹科·弗尔·安默尔贡。在艾尼姆·法尔申的演员阵容中,费勒的表现很差。这是一种很好的蚂蚁草,我的名字叫“jung”bin。