iOS的FFT Accerelate.framework回放期间绘制光谱(iOS FFT Accer

2019-07-29 10:06发布

UPDATE 2016年3月15日

请看一看这个项目: https://github.com/ooper-shlab/aurioTouch2.0-Swift 。 它已经被移植到斯威夫特和包含你正在寻找每一个答案,如果你在这里凸轮。


我做了很多的研究,并学到了很多关于FFT和加速框架。 但实验天后我有点沮丧。

我想在图中的播放期间显示的音频文件的频谱。 对于每个时间间隔它应该显示(在我的情况下的512个值)通过在x轴的FFT计算在上Y轴(由红色条显示),用于每个频率分贝的幅值。

输出应该是这样的:

我充满了1024个样本中仅提取用于开始左声道的缓冲区。 然后,我做这一切的FFT东西。

这是我到目前为止的代码:

设置一些变量

- (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);  
}

这样做的FFT。 FrequencyArray仅仅是一个数据结构,具有512的浮点值。

- (FrequencyArry)performFastFourierTransformForSampleData:(SInt16*)sampleData andSampleRate:(UInt16)sampleRate   
{  
    NSLog(@"log2n %i n %i,  nOver2 %i", log2n, n, nOver2);

    // n = 1024
    // log2n 10
    // nOver2 = 512

    for (int i = 0; i < n; i++) {
        originalReal[i] = (float) sampleData[i];
    }

    vDSP_ctoz((COMPLEX *) originalReal, 2, &A, 1, nOver2);

    vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);

    float scale = (float) 1.0 / (2 * n);

    vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);
    vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);

    vDSP_ztoc(&A, 1, (COMPLEX *) obtainedReal, 2, nOver2);

    FrequencyArry frequencyArray;

    for (int i = 0; i < nOver2; i++) {
        frequencyArray.frequency[i] = log10f(obtainedReal[i]); // Magnitude in db???
    }

    return frequencyArray;  
}

输出看起来总是很怪,虽然它的一些怎么好像根据音乐移动。

我很高兴,我来到迄今由于一些很好的职位这里是这样的: 使用苹果FFT和加速框架

但现在我不知道该怎么办。 我在想什么?

Answer 1:

首先你没有应用窗函数之前的FFT -这将导致由于频谱的拖尾频谱泄漏 。

其次,你只是使用FFT输出纸盒的实部来计算分贝的大小 - 你需要使用复杂的幅度:

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


文章来源: iOS FFT Accerelate.framework draw spectrum during playback