2009-12-11 1 views
8

Как реализовать следующую функцию в C#?Как реализовать функцию частоты клавиш фортепиано в C#?

alt text

+0

Я предлагаю вам ознакомиться с System.Math.Pow - http://msdn.microsoft.com/en-us/library/system .math.pow (VS.71) .aspx - это позволит вам обрабатывать как экспоненты, так и n-ые корни. –

+16

Построение пианино, не так ли? –

+0

Как это пианино? Кто-нибудь хочет объяснить PLS? –

ответ

34
double F = 440.0 * Math.Pow(2.0, (n-49.0)/12.0); 
+3

+1 для вызова Math.Pow только один раз – ram

+0

Вы правы, уравнение может быть упрощено для вашего ответа, но я сделал прямую реализацию. –

13
440 * Math.Pow(Math.Pow(2, 1.0/12), n - 49) 
+0

+1, строгое значение –

2
440 * 12th root of 2 raised to n-49 
= 440 * (2^1/12) ^(n-49) 
= 440 * 2^(n/12)/2^(49/12) 
= 440 * 2^(n/12)/(2^4 * 2^1/12) 
= 440 * (1/2^4) * 2^((n-1) /12) 
= 8 * 55 * (1/16) * 2^((n-1) /12) 
= 27.5 * 2^((n-1) /12) 

так ....

double d = 27.5 * Math.Pow(2, (n-1)/12.0) 

А с 12-го корня 2 = 1.0594630943592952645618252949463, затем

double d = 27.5 * Math.Pow(1.0594630943592952645618252949463, (n-1)) 

так ...

double d = 27.5 * Math.Pow(1.059463094359295, (n-1)); 
+0

Надеюсь, что если это решение будет использовано, для удобства обслуживания будет сделан комментарий. –

+0

Вы уверены, что математика в порядке? Попробуйте n = 49. Вы должны получить 440. –

+0

хорошая ловушка 12-й корень из 2 = 1.0594630943592952645618252949463, а не .083333333333333 ... Я побежал Windows calc плохо ... Я отредактировал, чтобы исправить. –

Смежные вопросы