android - 手动绘制的图表上的频率不正确
问题描述
我目前正在为大学编写 android 频谱分析仪,其中一部分涉及绘制声音的 FFT。但是,我在绘制频率时遇到问题。频率值一开始是正确的,但随着我移到更高的频率,误差变得越来越大(在 3000Hz 时,图表将显示 ~3750)。我觉得我计算 x 轴或频率值的方式有错误。这是出于速度目的手动绘制的图表。
如果需要更多信息/代码,请告诉我,但我的猜测是我忽略了一些简单的事情。谢谢
xVal 是频率值。比例值是根据真实的图形尺寸对其进行缩放。
int length = currentWaveDataDouble.length;
int pow2 = Integer.highestOneBit(length) << 1;
int sampleRate = 44100;
...
//actual plot part
for(int i =0; i<p2.length; i++) {
float xVal = (float)(i * scaleX.ScaleValue(((double) sampleRate / (pow2 >> 1))));
if (xVal < maxFreqPlus1) {
xVal += axisWidth + yAxisMargin;
float yVal = (float) scaleY.ScaleValue(p2[i]);
yVal += axisWidth + xAxisMargin;
canvas.drawPoint(xVal,yVal, marker);
if(yVal > yMax)
{
yMax = yVal;
xMax = xVal;
}
}
}
解决方案
发现问题。它在缩放器中。
ValueScaler scaleY = new ValueScaler(0,maxAmpPlus1 - yAxisMargin,0,baseY);
ValueScaler scaleX = new ValueScaler(0,maxFreqPlus1 - xAxisMargin,0,baseX);
缩放数字时,我没有考虑 x 和 y 边距。
推荐阅读
- python - 随机森林中每个特征级别的重要性顺序
- c# - Xamarin Shell:将多个参数传递到另一个页面
- loops - 如何在 Rust 的 for 循环中获取当前元素的索引?
- python - 调用 pool.join 时 Python 多进程线程错误或退出代码
- java - Flyway 没有创建表格
- flutter - Flutter - 尝试使用 Tensorflowlite - FloatEfficientNet
- c# - 如何使用 c# 将 DTO 添加到列表对象
- java - 如何在对象列表中推送值?
- flutter - 如何使用 Flutter 在 AnalogClock() 小部件中显示不同时区的时间?
- react-native - 如何创建一个滚动视图,它在某个特定视图处停止?