Kiss FFT bin幅度
|
我已经花了很多时间研究FFT。使用KISSFFT尤其使我感兴趣,因为它是一种非常可移植的C实现。
我仍然不清楚如何将i [x]和r [x]转换为频率仓的幅度。因此创建了一个带符号的int 16版本的sin。我有512个罪恶样本。我希望看到一个Bin带有数据,其余的为零。不是啊
这是我的代码...
- (IBAction)testFFT:(id)sender{
NSLog(@\"testFFT\");
static double xAxis = 0;
static int sampleCount = 0;
static double pieSteps;
static double fullSinWave = 3.14159265*2;
static double sampleRate = 44100;
static double wantedHz = 0;
int octiveOffset;
char * globalString = stringToSend;
SInt16 dataStream[512];
// Notes: ioData contains buffers (may be more than one!)
// Fill them up as much as you can. Remember to set the size value in each buffer to match how
// much data is in the buffer.
for (int j = 0; j < 512; j++) {
wantedHz = 1000;
pieSteps = fullSinWave/(sampleRate/wantedHz);
xAxis += pieSteps;
dataStream[j] = (SInt16)(sin(xAxis) * 32768.0);
NSLog(@\"%d) %d\", j, dataStream[j]);
}
kiss_fft_cfg mycfg = kiss_fft_alloc(512,0,NULL,NULL);
kiss_fft_cpx* in_buf = malloc(sizeof(kiss_fft_cpx)*512);
kiss_fft_cpx* out_buf = malloc(sizeof(kiss_fft_cpx)*512);
for (int i = 0;i < 512;i++){
in_buf[i].r = dataStream[i];
in_buf[i].i = dataStream[i];
}
kiss_fft(mycfg,in_buf, out_buf);
for (int i = 0;i < 256;i++){
ix = out_buf[i].i;
rx = out_buf[i].r;
printfbar(sqrt(ix*ix+rx*rx)););
}
}
我得到的结果看起来像这样...
*****
*********************
****************************
*********************
************************
*********************
****************************
*********************
*****
*********************
****************************
*********************
*****************
*********************
****************************
*********************
*****
*********************
****************************
*********************
************************
*********************
****************************
*********************
没有找到相关结果
已邀请:
2 个回复
淘圃跺枯替
将有助于减少数字错误。
会将输入缓冲区设置为
,之前您已将其设置为ѭ4where,其中
。 将
移出循环看起来更好。 还有一个更基本的问题:您设置
。采样率为44.1 kHz时,相当于
。使用512点的缓冲区,您将在缓冲区中获得11.6个正弦波周期。非整数周期会导致泄漏。 但是,在进行此设置之前,尝试将ѭ9设置为正好在缓冲区中提供12个周期。您应该在变换中看到两个峰值:一个在索引12,一个在索引511-12。 您会看到两个峰值的原因是
的变换是
。也就是说,在变换的虚部,您在w_0和-w_0处获得了脉冲函数。它们之所以在原处,是因为变换从0变为2 * pi。 执行完此操作后,返回
,缓冲区中的循环数为非整数。您应该看到一个以帐篷11和511-11为中心的宽帐篷形结果。您应将
乘以窗口函数(Hann很好),以减少此效果的影响。
挂帘妈乡
}