首页 > 解决方案 > 声音频率到八度和键号

问题描述

给定波的频率,确定从 0 到 7 的八度音阶和调号,其中 0 是 C,6 是 B,C# 是 7,A# 是 11。

您可以使用一系列 if 语句来解决它,但必须有更好的方法来解决它。我的项目使用的语言是 Clojure,但我猜任何解决方案都可以轻松移植到任何语言。

标签: mathclojuresignal-processing

解决方案


以下假设您使用的是缓和半音阶。音符具有对数频率刻度。每增加一个八度音程,频率就会乘以 2。在一个八度范围内,音符 C、C#、D、D#、E、F、F#、G、G#、A、A#、B 有十二个等比例的音​​阶,编号从 0 到 11。

要从频率中获取八度数和音符数:

  • 将频率的对数以 2 为底。
  • 减去中间 C 的频率的对数。
    • 整数部分为八度数;
    • (正)余数乘以十二,就是音符编号。这将不准确。

低于中间 C 的音符有一个负八度数。


推荐阅读