簡體   English   中英

如何在位圖圖像上繪制對數軸

[英]How do I Draw Logarithmic Axis on Bitmap Image

我正在創建一個頻譜圖,其中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

要在兩個值之間創建對數刻度,設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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM