WAV的Audio Visualizer看起来不对

杰森

我无法使音频可视化器看起来准确。具有大量声音的垃圾箱往往会正确绘制,但是我遇到的问题是,所有没有明显声音的频率似乎都以一个通常在-60dB到-40dB之间反弹的值返回。这将形成一条平坦的弹跳线(通常在较高的频率中)。

我想以每秒30帧的速度显示512 bins或更少。我已经连续几周阅读FFT和音频不间断了,到目前为止,我的过程是:

  • 从wav文件加载pcm数据。这是每秒44100个样本,范围为-/ +32767。我假设将它们传递给FFT时将它们视为实数。
  • 将这些样本分成每帧1470个。(忽略446)
  • 采集1024个样本并应用Hann窗口。
  • 将样本作为real [1024]的数组以及大小相同的另一数组传递给FFT,虚部用零填充。
  • 通过遍历(samples / 2)个bin并执行sqrt(real [i] * real [i] + img [i] * img [i])获得幅度。
  • 取20 * log(量级)以获得每个仓的分贝水平
  • 为每个垃圾箱绘制一个矩形。为每帧绘制这些垃圾箱。

我已经用几首歌曲对其进行了测试,并且生成了一个wav文件,该文件只播放440Hz的音调。使用wav文件时,确实在440 bin处出现峰值,但是所有其他bin形成的行并不比440 bin短很多。同样,每隔一个帧,与440分开的bin看起来就像是一个图形对数函数,在某个其他bin上有一个倾斜。

我用C ++编写。使用STK仅从音频文件加载左声道:

//put every sample in the song into a temporary vector
for (int i = 0; i < stkObject->getSize(); i++)
{
    standardVector.push_back(stkObject->tick(LEFT));
}

我正在使用FFTReal执行FFT:

    std::vector<std::vector <double> > leftChannelData;
    int numberOfFrames = stkObject->getSize()/samplesPerFrame;

    leftChannelData.resize(numberOfFrames);
    for(int i = 0; i < numberOfFrames; i++)
    {
        for(int j = 0; j < FFT_SAMPLE_LENGTH; j++)
        {
            real[j] = standardVector[j + (i*samplesPerFrame)];
        }

        applyHannWindow(real, FFT_SAMPLE_LENGTH);
        fft_object.do_fft(imaginary,real);

        //FFTReal instructions say to run this after an fft
        fft_object.rescale(real);

        leftChannelData[i].resize(FFT_SAMPLE_LENGTH/2);
        for (int j = 0; j < FFT_SAMPLE_LENGTH/2; j++)
        {
            double magnitude = sqrt(real[j]*real[j] + imaginary[j]*imaginary[j]);
            double dbValue = 20 * log(magnitude/maxMagnitude);

            leftChannelData[i].at(j) = dbValue;
        }
    }

我不知道是什么原因造成的。我尝试了各种方法来提取我忽略的446个样本,但结果似乎并没有改变。我想我可能做的是根本错误的事情。我尝试过将pcm数据归一化后再传递给fft,并且尝试过对幅度进行归一化后再找到分贝,但似乎没有用。有什么想法吗?

编辑:我看不到log(magnitude)和log(magnitude / maxMagnitude)之间的任何区别。似乎要做的就是将bin的所有值平均向下移动。

EDIT2:这是他们看上去很像的样子:

歌曲播放声音低-带对数(mag)

歌曲播放低声音-相同但带有对数(mag / maxMag)

同样,log(mag)和log(mag / maxMag)通常看起来相同,但是值范围为负数。就像MSalters所说的那样,分贝可以接近-无限,因此我可以将这些值钳位到-100dB。然后取log(mag / maxMag)并加100。这样矩形的高度范围从0到100,而不是-100到0。

这是我应该做的吗?我已经尝试过了,但是看起来还是错误的。也许这只是一个扩展问题?当我这样做时,当听起来像是应该的时,很多酒吧都不会使其超出线条。如果确实将其设置为大于0,则几乎不会这样做。

hotpaw2

长度为1024的Von Hann量化窗口所产生的噪声(阻带纹波)可能约为-40至-60 dB。因此,一种策略是只设置一个阈值,然后忽略(不绘制)低于该阈值的所有值。

另外,请尝试删除rescale(real)函数,因为在采用对数幅度之前,这可能会使您的复数向量失真。

另外,请确保您确实将音频样本正确地加载到真实矢量中(符号,位数和字节序)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WAV的Audio Visualizer看起来不对

来自分类Dev

SourceTree Git图看起来不对

来自分类Dev

未访问的链接看起来不对

来自分类Dev

Java BigInteger 加法看起来不对

来自分类Dev

D3基数线插值看起来不对

来自分类Dev

CSS渐变看起来不对称吗?

来自分类Dev

面板布局内的引导表格看起来不对

来自分类Dev

用于listview的Android设计规范看起来不对

来自分类Dev

ggsn全球地图比例尺看起来不对

来自分类Dev

为什么我的谷歌图表看起来不对

来自分类Dev

为什么这个random()分布看起来不对称?

来自分类Dev

为什么我的毫秒在JS秒表中看起来不对

来自分类Dev

缩小我的网站时,一切看起来都不对劲

来自分类Dev

在Fedora 17上从KDE 4.10切换后,GNOME 3.4看起来不对。

来自分类Dev

尽管语法看起来不对,但为什么下面的 SQL 查询仍然有效?

来自分类Dev

backBarButtonItem看起来不快

来自分类Dev

backBarButtonItem看起来不快

来自分类Dev

哎呀,看起来出事了

来自分类Dev

哎呀,看起来出事了 :(

来自分类Dev

布局网站IE8和更低版本的CSS3看起来不对

来自分类Dev

哎呦,看起来像出事了

来自分类Dev

使Rascal结构看起来更好

来自分类Dev

如何使按钮看起来像标签?

来自分类Dev

哎呀,看起来出事了。Laravel 5.0

来自分类Dev

绘制看起来像球体的球体

来自分类Dev

Heroku看起来与Localhost不同

来自分类Dev

Visual Studio图标看起来不好

来自分类Dev

使普通布局看起来像PreferenceScreen

来自分类Dev

看起来确实流畅的文字