Iphone 如何显示一个简单的动画频谱图来可视化来自混音器HOSTAUDIO对象的音频?

Iphone 如何显示一个简单的动画频谱图来可视化来自混音器HOSTAUDIO对象的音频?,iphone,objective-c,Iphone,Objective C,我正在研究苹果公司的一些混音示例代码(),我想显示一个动画的声谱图(想想位于顶部中间的itunes声谱图,它用移动条代替歌曲标题)。它需要以某种方式从音频流现场获取数据,因为用户将把几个循环混合在一起。我似乎在网上找不到任何与此相关的教程。苹果的aurioTouch示例应用程序(位于developer.Apple.com上)有从录制的音频输入绘制动画频谱图的源代码。您可能可以将FFT箱分组到频率范围中,以获得更粗糙的条形图。苹果的aurioTouch示例应用程序(位于developer.Appl

我正在研究苹果公司的一些混音示例代码(),我想显示一个动画的声谱图(想想位于顶部中间的itunes声谱图,它用移动条代替歌曲标题)。它需要以某种方式从音频流现场获取数据,因为用户将把几个循环混合在一起。我似乎在网上找不到任何与此相关的教程。

苹果的aurioTouch示例应用程序(位于developer.Apple.com上)有从录制的音频输入绘制动画频谱图的源代码。您可能可以将FFT箱分组到频率范围中,以获得更粗糙的条形图。苹果的aurioTouch示例应用程序(位于developer.Apple.com)提供了从录制的音频输入绘制动画频谱图的源代码。你可能会将FFT单元分组到频率范围中,以获得更粗糙的条形图。

我知道我回答这个问题真的迟到了。但我刚刚找到了一些很好的资源来解决这个问题

解决方案:

  • 实例化音频单元,从iOS设备的麦克风录制样本
  • 在苹果的加速框架中使用vDSP函数执行FFT计算
  • 使用UIImage将结果绘制到屏幕上
  • 计算音频信号的FFT或频谱图是音频信号处理的基础。作为一名iOS开发者,如果你对音频感兴趣的话,不管你是想简单地找到声音的音高,创建一个很好的可视化效果,还是做一些前端处理,这都是你可能会考虑的事情。苹果确实提供了一个示例应用程序来说明这个任务(aurioTouch)。然而,由于广泛使用OpenGL,该应用程序的音频处理部分变得模糊不清

    该项目的目标是尽可能多地从示例应用程序中提取音频dsp,并仅使用UIKit呈现可视化效果。在iOS 6.1模拟器中运行的最终应用程序显示在左侧。有三个组成部分。RSCODEPUP1在顶部一个简单的“退出”按钮,底部有一个增益滑块(允许用户调整幅度谱和显示的颜色的亮度之间的比例),以及在中间显示每三秒刷新的功率谱数据的UIIVIEVIEW。请注意,从图像顶部开始,频率从低到高。因此,显示器的顶部实际上是直流电,而底部是奈奎斯特速率。这幅图像显示了一些语音处理的结果

    这个特殊的频谱图应用程序在256点长的帧中以11025 Hz的频率记录音频样本。这大约是每帧0.0232秒。帧使用256点汉宁窗口加窗,重叠1/2帧

    让我们检查一下代码中可能引起混淆的一些相关部分。如果您想尝试自己构建此项目,可以在下面的存档中找到源文件

    首先看一下PerformThru方法的内容。这是音频单元的回调。在这里,我们将音频样本从缓冲区读取到我们声明的一个数组中

    SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);
    for (i=0; i<inNumberFrames; i++) {
    
         framea[readlas1] = data_ptr[2];
    
         readlas1 += 1;
    
         if (readlas1 >=33075) {
           readlas1 = 0;
    
           dispatch_async(dispatch_get_main_queue(), ^{
             [THIS printframemethod];
           });
         }
    
    data_ptr += 4;
    
    }
    
    SInt8*数据(SInt8*)(ioData->mBuffers[0].mData);
    对于(i=0;i=33075){
    readlas1=0;
    dispatch\u async(dispatch\u get\u main\u queue()^{
    [此打印框方法];
    });
    }
    数据_ptr+=4;
    }
    
    请注意,framea是一个长度为33075的静态数组。变量readlas1跟踪已读取的样本数。当计数器达到33075(此采样频率为3秒)时,将触发对另一个方法printframemethod的调用,并重新启动该过程

    谱图采用printframemethod计算

    for (int b = 0; b < 33075; b++) {
      originalReal[b]=((float)framea[b]) * (1.0 ); //+ (1.0 * hanningwindow[b]));
    }
    
    for (int mm = 0; mm < 250; mm++) {
    
    for (int b = 0; b < 256; b++) {
      tempReal[b]=((float)framea[b + (128 * mm)]) * (0.0 + 1.0 * hanningwindow[b]);
    }
    
    
    
    vDSP_ctoz((COMPLEX *) tempReal, 2, &A, 1, nOver2);
    vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);
    
    scale = (float) 1. / 128.;
    
    vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);
    vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);
    
    for (int b = 0; b < nOver2; b++) {
      B.realp[b] = (32.0 * sqrtf((A.realp[b] * A.realp[b]) + (A.imagp[b] * A.imagp[b])));
    }
    
    for (int k = 0; k < 127; k++) {
      Bspecgram[mm][k]=gainSlider.value * logf(B.realp[k]);
      if (Bspecgram[mm][k]<0) {
        Bspecgram[mm][k]=0.0;
      }
    }
    
    }
    
    for(int b=0;b<33075;b++){
    原始实数[b]=((float)framea[b])*(1.0);//+(1.0*汉宁窗[b]);
    }
    用于(int mm=0;mm<250;mm++){
    对于(int b=0;b<256;b++){
    tempReal[b]=((浮点)帧a[b+(128*mm)])*(0.0+1.0*汉宁窗[b]);
    }
    vDSP_ctoz((复杂*)tempReal,2,&A,1,11月2日);
    vDSP_fft_zrip(setupReal、A、stride、log2n、fft_FORWARD);
    比例=(浮动)1./128。;
    vDSP_vsmul(A.realp,1和scale,A.realp,1,11月2日);
    vDSP_vsmul(A.imagp,1,和scale,A.imagp,1,11月2日);
    对于(int b=0;b如果(bspegram[mm][k]我知道这个问题我真的来晚了。但是我刚刚找到了一些很好的资源来解决这个问题

    解决方案:

  • 实例化音频单元,从iOS设备的麦克风录制样本
  • 在苹果的加速框架中使用vDSP函数执行FFT计算
  • 使用UIImage将结果绘制到屏幕上
  • 计算音频信号的FFT或频谱图是一种基本的音频信号处理。作为一名iOS开发人员,无论你是想简单地找到声音的音调,创建一个良好的可视化效果,还是做一些前端处理,如果你对音频感兴趣的话,你可能会想到这一点。苹果确实提供了一个示例ap演示此任务的应用程序(aurioTouch)。该应用程序的音频处理部分因广泛使用OpenGL而变得模糊

    该项目的目标是从示例应用程序中提取尽可能多的音频dsp,并仅使用UIKit呈现可视化效果。在iOS 6.1模拟器中运行的最终应用程序如左图所示。有三个组件。RSCode1在顶部有一个简单的“退出”按钮,在底部有一个增益滑块(允许用户调整幅度谱与显示的颜色的亮度之间的缩放),以及在中间显示功率谱数据的UIIVIEVIEW。