java visualizer_来自wav的Audio Visualizer看起来不对劲

我在制作视听器看起来很准确方面遇到了麻烦 . 具有大量声音的音箱倾向于正确绘制,但我遇到的问题是没有明显声音的所有频率似乎都会返回,其值通常在-60dB和-40dB之间反弹 . 这形成了扁平的弹跳线(通常在较高的频率中) .

我希望以每秒30帧的速度显示512个或更少的分档 . 我一直在读FFT和音频不停几个星期了,到目前为止我的过程是:

从wav文件加载pcm数据 . 这是每秒44100个样本,范围为 - / 32767.我假设我将它们作为实数传递给FFT时 .

将这些样本分成每帧1470个 . (446被忽略)

取1024个样本并应用Hann窗口 .

将样本传递给FFT,作为实数[1024]的数组以及另一个相同大小的数组,用虚部填充零 .

通过循环遍历(samples / 2)二进制位并获得一个sqrt(real [i] * real [i] img [i] * img [i])来获得幅度 .

取20 * log(幅度)来获得每个bin的分贝级别

为每个箱子绘制一个矩形 . 为每个帧绘制这些箱子 .

我用几首歌测试了它,我生成的一个wav文件只播放440Hz的音调 . 使用wav文件,我确实在440 bin处获得了一个尖峰,但是所有其他的bin都形成了一个不比440 bin短的行 . 除了每隔一个框架,除了440之外的垃圾箱看起来像是一个图形化的日志功能,还有一些其他垃圾箱 .

我是用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<:vector> > 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(幅度)和log(幅度/ maxMagnitude)之间的任何差异 . 它似乎只是将所有bin的值均匀向下移动 .

EDIT2:这是他们看起来像是一个视觉效果:

Song playing low sounds - 与log(mag / maxMag)相同但相同

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

这是我应该做的吗?我试过这个,但看起来仍然不对劲 . 也许这只是一个扩展问题?当我这样做的时候,当它听起来应该是这样的时候,很多条都不会让它在线上方 . 如果他们确实超过0,他们就这么做了 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值