如何在位图图像上绘制对数轴

马吉卡

我正在创建一个频谱图,其中y轴是输入文件的频率响应。基于最小和最大频率(根据fs可变),我将如何:

  1. 如下图示例所示,以对数分布方式以有意义的方式绘制频率的y轴。log10(f),在下面的图表中,频率位于x轴上,仅用于说明一个点

图1 频率响应图

先前的图像替换为一个更合适的对数刻度表示

  1. 提供多个沿y轴注释参考点要值直接相关,即100Hz的,为1kHz,5kHz的(在1/3倍频带如所指出的在这里

  2. 定义像素与频率的映射比率方法,以绘制沿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));

我具有在以下轴上绘制的所有必要数据:

  1. x时间(线性)
  2. y频率(对数)
  3. z强度(对数)

另一个挑战是,图像是从左上角而不是右下角渲染的,因此,如果您可以向我展示一种明智的管理方式,那将非常有用。

这是使用.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
伊夫·达乌斯特(Yves Daoust)

要在两个值之间创建对数刻度,请让V0V1,以10为底的对数log(V1)log(V2)然后重新缩放以映射到绘图上所需的坐标,让X0X1

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在具有对数轴的现有图像上绘制?

来自分类Dev

如何在位图(Winforms)上绘制清晰的文本?

来自分类Dev

如何在matplotlib中的对数轴上设置刻度线

来自分类常见问题

如何在位图上绘制粗体文本?

来自分类Dev

如何在位图图像中找到空白区域

来自分类Dev

如何在位图图像中找到空白区域

来自分类Dev

Visiblox上的对数轴

来自分类Dev

如何在SurfaceView上绘制位图?

来自分类Dev

如何在位图上居中和缩放叠加的可绘制图标

来自分类Dev

如何使用EaselJS在位图的顶部绘制/绘制线条?

来自分类Dev

如何在位图中缓存Surfaceview?

来自分类Dev

如何在ImageView中的图像位图上绘制矩形

来自分类Dev

如何在位图Android上获取红色像素数

来自分类Dev

如何在固定响应的 Bootstrap 图像上定位图像

来自分类Dev

无法用对数轴绘制区域

来自分类Dev

无法用对数轴绘制区域

来自分类Dev

如何在HTML画布上绘制位图文件?

来自分类Dev

如何在HTML画布上绘制位图文件?

来自分类Dev

如何在画布上绘制3位图

来自分类Dev

如何使用另一个位图作为蒙版在位图上绘制?

来自分类Dev

如何在画布上绘制位图,同时注意位图的Alpha值?

来自分类Dev

如何在缩放的图像上绘制?

来自分类Dev

如何在图像上绘制svg?

来自分类Dev

如何在图像上绘制透明形状

来自分类Dev

如何在图像(WPF)上绘制折线

来自分类Dev

如何在图像上绘制新数据?

来自分类Dev

如何在图像上绘制散点图?

来自分类Dev

如何在位图内容周围设置边框?

来自分类Dev

如何在Canvas ..上设置图像?然后在图像上绘制