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