我正在创建一个频谱图,其中y轴是输入文件的频率响应。基于最小和最大频率(根据fs可变),我将如何:
先前的图像替换为一个更合适的对数刻度表示
提供多个沿y轴注释参考点要值直接相关,即100Hz的,为1kHz,5kHz的(在1/3倍频带如所指出的在这里)
定义像素与频率的映射比率方法,以绘制沿y轴有n个频率仓的频率
最后,尽管我能够使用以下代码创建基本图形,但我对如何最好地在位图图像中实现对数比例感到有些困惑:
Bitmap spectrogram = new Bitmap(xAxisImageSize, yAxisImageSize);
// Mmake the Image BG Colour Black
using (Graphics graph = Graphics.FromImage(spectrogram))
{
Rectangle ImageSize = new Rectangle(0, 0, xAxisImageSize, yAxisImageSize);
graph.FillRectangle(Brushes.Black, ImageSize);
Pen whitePen = new Pen(Color.White, 3);
// x axis
graph.DrawLine(whitePen, 124, 900, 634, 900);
// x axis label
graph.DrawString("Time", new Font("Arial", 12), Brushes.White, new PointF(600, 924));
// y axis
graph.DrawLine(whitePen, 124, 900, 124, 388);
// y axis label
graph.DrawString("f (Hz)", new Font("Arial", 12), Brushes.White, new PointF(24, 388));
// y axis top frequency
graph.DrawString("20k", new Font("Arial", 12), Brushes.White, new PointF(75, 388));
// y axis top marker
graph.DrawLine(whitePen, 110, 388, 124, 388);
// x axis Zero Point
graph.DrawString("0", new Font("Arial", 12), Brushes.White, new PointF(124, 924));
// y axis Zero Point
graph.DrawString("0", new Font("Arial", 12), Brushes.White, new PointF(75, 886));
}
我到目前为止所创建图像的缩放渲染可以在下面看到。
频谱图中的每个(单色)点将使用以下代码段进行绘制:
spectrogram.SetPixel(x, y, Color.FromArgb(255, colour, colour, colour));
我具有在以下轴上绘制的所有必要数据:
另一个挑战是,图像是从左上角而不是右下角渲染的,因此,如果您可以向我展示一种明智的管理方式,那将非常有用。
这是使用.NET 4.5.2的ac#控制台应用程序
更新
通过希望澄清这个问题,我想要实现的是类似于图的对数比例模式,并在位图图轴而不是图控件上实现:
axis.IsLogarithmic = true;
因此,以log10(频率)为例(在我的示例中),在0 Hz和21963 Hz之间有256个点/频率仓,然后将其映射到y轴上,并在y轴上使用通用的1/3倍频程中心频率符号,如下所示:
请注意,上面的图像是从此帖子中获取的,OP正在向我请求类似的信息,但在图表控件上,由于未使用图表对象,因此无法使用其答案。
有关256点/频点我的意思的说明,请参见以下内容:
Frequency Bin 0: 0
Frequency Bin 1: 86
Frequency Bin 2: 172
Frequency Bin 3: 258
Frequency Bin 4: 344
Frequency Bin 5: 430
Frequency Bin 6: 516
Frequency Bin 7: 602
Frequency Bin 8: 689
Frequency Bin 9: 775
Frequency Bin 10: 861
Frequency Bin 11: 947
Frequency Bin 12: 1033
Frequency Bin 13: 1119
.....
Frequency Bin 242: 20844
Frequency Bin 243: 20930
Frequency Bin 244: 21016
Frequency Bin 245: 21102
Frequency Bin 246: 21188
Frequency Bin 247: 21274
Frequency Bin 248: 21360
Frequency Bin 249: 21447
Frequency Bin 250: 21533
Frequency Bin 251: 21619
Frequency Bin 252: 21705
Frequency Bin 253: 21791
Frequency Bin 254: 21877
Frequency Bin 255: 21963
要在两个值之间创建对数刻度,请让V0
和V1
,以10为底的对数log(V1)
,log(V2)
然后重新缩放以映射到绘图上所需的坐标,让X0
到X1
。
X = X0 + (X1 - X0)(log(V) - log(V0))/(log(V1) - log(V0))
要绘制简单值的刻度线,请先确定从10^floor(log(V0))
到的整整十年10^floor(log(V1))
,然后通过来获得最高有效位数
ceil(10^(log(V0) - floor(log(V0)))
floor(10^(log(V1) - floor(log(V1)))
在这几十年中获得开始/结束的数字。
例如,从19到3410,十年从10/100到1000/10000,包括2到3。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句