1

我正在查看 aurio touch 声波图示例,并看到它显示不同的 FFT 频带,具体取决于它们的大小,颜色范围从蓝色到紫色到红色到白色。没有声音时,图表为黑色。对于低强度的声音,不同的频段显示蓝色。当声音幅度增加时,颜色会变得“更热”——变成红白热。这有助于用户轻松查看正在发生的事情。

我需要有关如何实现类似颜色编码算法的建议,而无需确切知道信号的最大幅度。

Aurio 触摸声像图示例

我试图创造类似的东西,但到目前为止取得的成功有限。这是我正在使用的代码:

预先计算不同大小的 FFT 的颜色

colorMapGreen = [[NSMutableDictionary alloc] initWithCapacity:256];

        for(int i = 0; i<256; i ++)
        {

            [colorMapGreen setObject:[UIColor colorWithHue:0.2 saturation:1 brightness:(i/256.0) alpha:1] forKey:[NSNumber numberWithInt:i]];

        }

我遇到的问题是我不知道我将要查看的信号的最大幅度是多少。它变化很大——从 12000 到 50000。如果我尝试调整我的颜色映射,结果要么太暗,要么太亮,而且没有真正的描述性。

这就是我试图区分不同幅度带的方法。我真的希望低端(低于 4000)出现并在其他乐队中可见。

 magnitude=sqrt(magnitudes[i]);
        if(magnitude<4000)
        {
            //0 to 128
            index = magnitude*0.0213;

        }else if(magnitude < 15000)
        {
            //to 168
            index = magnitude*0.0112;

        }else if(magnitude < 30000)
        {
            //to 196
            index = magnitude*0.00653;
        }else if(magnitude < 100000)
        {
            //to 228
            index = magnitude*0.00228;

        }else if(magnitude < 10000000)
        {
            index = magnitude*0.0000256;

        }else
        {
            ((UIView*)[self.markerViews objectAtIndex:i]).backgroundColor = [UIColor whiteColor];
        }
 ((UIView*)[self.markerViews objectAtIndex:i]).backgroundColor = [colorMapGreen objectForKey:[NSNumber numberWithInt:index]];

谁能建议一种颜色映射算法的实现,它看起来更接近 AurioTouch 的冷热示例?

这是我的代码显示的内容: 在此处输入图像描述

4

2 回答 2

2

需要覆盖宽动态范围的颜色图通常使用缩放的对数(幅度)而不是绝对幅度进行着色,以索引到映射表或方程中。

于 2013-05-11T20:53:44.233 回答
0

这是您必须自己做的事情;如果音频不是实时的,那么您可以对其进行标准化,否则您只需给用户一个增益旋钮。如果您正在处理音频并且AudioUnit可用,您可以在 FFT 的输入上应用一个严格的压缩器,作为自动增益校正的一种形式。

于 2013-05-11T17:20:54.817 回答