iOS FFT Accerelate.framework在播放期间绘制频谱

iOS FFT Accerelate.framework在播放期间绘制频谱,ios,fft,frequency,spectrum,Ios,Fft,Frequency,Spectrum,更新2016-03-15 请查看此项目:。它已经被移植到Swift,包含了你想要的每一个答案,如果你在这里的话。 我做了很多研究,学到了很多关于FFT和加速框架的知识。但是经过几天的实验,我有点沮丧 我想在图表中显示播放期间音频文件的频谱。对于每个时间间隔,它应该在Y轴上显示由X轴上的FFT计算的每个频率(在我的情况下为512个值)的幅值(以db为单位)(以红色条显示) 输出应如下所示: 我用1024个样本填充缓冲区,只提取左通道作为开始。然后我做所有这些事情 以下是我目前的代码: 设置一些

更新2016-03-15

请查看此项目:。它已经被移植到Swift,包含了你想要的每一个答案,如果你在这里的话。
我做了很多研究,学到了很多关于FFT和加速框架的知识。但是经过几天的实验,我有点沮丧

我想在图表中显示播放期间音频文件的频谱。对于每个时间间隔,它应该在Y轴上显示由X轴上的FFT计算的每个频率(在我的情况下为512个值)的幅值(以db为单位)(以红色条显示)

输出应如下所示:

我用1024个样本填充缓冲区,只提取左通道作为开始。然后我做所有这些事情

以下是我目前的代码:

设置一些变量

- (void)setupVars  
{  
    maxSamples = 1024;

    log2n = log2f(maxSamples);  
    n = 1 << log2n;  

    stride = 1;  
    nOver2 = maxSamples/2;  

    A.realp = (float *) malloc(nOver2 * sizeof(float));  
    A.imagp = (float *) malloc(nOver2 * sizeof(float));  
    memset(A.imagp, 0, nOver2 * sizeof(float));

    obtainedReal = (float *) malloc(n * sizeof(float));  
    originalReal = (float *) malloc(n * sizeof(float));

    setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);  
}
-(无效)设置变量
{  
maxSamples=1024;
log2n=log2f(最大样本数);

n=1首先,在FFT之前没有应用a-这将导致频谱因以下原因而变得模糊

其次,您只需使用FFT输出箱的真实分量来计算dB幅值-您需要使用复数幅值:

magnitude_dB = 10 * log10(re * re + im * im);

您的输入数据是什么格式的?vDSP_zvmags(&A,1,获得日期,1,11月2日);获得相同的结果
magnitude_dB = 10 * log10(re * re + im * im);