【问题标题】:javascript - normalize a number so that it falls between a range between 0 and 1 [closed]javascript - 规范化一个数字,使其介于 0 和 1 之间 [关闭]
【发布时间】:2012-06-29 07:32:46
【问题描述】:

我有一个实验,我的程序从我的扬声器中拾取音频(以分贝为单位......有点)。范围通常在 0 到 20 之间。我想取该值并将其映射到 0 到 1 之间的范围,以便我可以根据扬声器的音量按比例缩放项目。因此,如果音频为 20 分贝,则比例为 1。如果音频为 0 分贝,则比例为 0。我该怎么做?我正在使用 Unity3D,如果这能让任何人对辅助函数有所了解的话。

【问题讨论】:

  • 嗯,我想要一种更动态的方式。
  • 数字不会跳舞。 “动态”是什么意思?有相关代码吗?
  • 是的...不好的问题。我配得上那个……
  • 我知道这个问题的表述不是很好,但这可能有助于其他人试图规范化数据。基本上,您需要获取数据集并将每个样本除以最大幅度。请注意,幅度指的是正值和负值。一个简单的例子可以是规范化旋转木马的滑动方向。例如。 var dir = (end.pos - start.pos)/Math.abs(end.pos - start.pos);这只是一个样本,因此我们将其自行划分。我们希望保留 + 和 - 信息,这就是我们使用 abs() 的原因。这总是给出 dir = 1 或 -1。只是我的两分钱
  • 感谢@Juank,它确实帮助完美地解决了我的问题。现在我的卡片无论大小或尺寸都均匀地向鼠标倾斜:D

标签: math unity3d range unityscript normalize


【解决方案1】:

如果您不想通过除法均匀地压缩分布,您可以使用适当的对数或指数。要使用对数,请移动数据以使最小值为 1,然后取对数(任何底数)并使用除法将其缩小。这将赋予较低端的价值更多的权重,并降低更高价值的回报。

使用指数可能更适合分贝,因为它们已经是对数刻度。只需为每个值增加一些常数,然后除以最大的结果。这将与对数缩放相反;大的数字会扩大彼此之间的差距,而较小的数字会拉近。

【讨论】:

    【解决方案2】:

    除以 20,如果这确实是最大值。

    var scale = function(db) {
       return db/20;
    }
    

        var scale = function(db) {
         if (db > 0)
             {
    
             return db/20;
    
             }
         else if (db < 0)
            {
    
            return "db is out of range"; # or do something
    
            }
         else 
            {
          return "something else";
    
            }
    
      }
    

    【讨论】:

    • 我想问题在于获取输出量的方程确实是近似的。有时 dB 值会变成负数,在这种情况下,简单的除法是行不通的。
    • 那么在选择如何标准化返回值之前,您只需测试 db 的范围。
    猜你喜欢
    • 2012-04-10
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多