3

我想使用 for 循环创建一个音符数组或向量。每个音符,A、A#、B、C...等都是上一个/下一个的 2^(1/12) 比率。例如,音符 A 是 440Hz,而 A# 是 440 * 2^(1/12) Hz = 446.16Hz。

从 27.5Hz (A0) 开始,我想要一个迭代 88 次的循环来创建每个音符频率高达 4186Hz 的数组,这样看起来像

f= [27.5 29.14 30.87 ... 4186.01]

到目前为止,我已经明白了很多:

   f  = [];
for i=1:87,
   %what goes here
   %  f = [27.5 * 2^(i/12)]; ?

end

return;
4

2 回答 2

4

在matlab中不需要为此做一个循环,你可以简单地做:

f = 27.5 * 2.^((0:87)/12)

答案:

f =

  Columns 1 through 13

         27.5       29.135       30.868       32.703       34.648       36.708       38.891       41.203       43.654       46.249       48.999       51.913           55

  Columns 14 through 26

        58.27       61.735       65.406       69.296       73.416       77.782       82.407       87.307       92.499       97.999       103.83          110       116.54

  Columns 27 through 39

       123.47       130.81       138.59       146.83       155.56       164.81       174.61          185          196       207.65          220       233.08       246.94

  Columns 40 through 52

       261.63       277.18       293.66       311.13       329.63       349.23       369.99          392        415.3          440       466.16       493.88       523.25

  Columns 53 through 65

       554.37       587.33       622.25       659.26       698.46       739.99       783.99       830.61          880       932.33       987.77       1046.5       1108.7

  Columns 66 through 78

       1174.7       1244.5       1318.5       1396.9         1480         1568       1661.2         1760       1864.7       1975.5         2093       2217.5       2349.3

  Columns 79 through 88

         2489         2637       2793.8         2960         3136       3322.4         3520       3729.3       3951.1         4186
于 2013-09-11T23:26:49.433 回答
2
maxind = 87;
f = zeros(1, maxind); % preallocate, better performance and avoids mlint warnings
for ii=1:maxind
  f(ii) = 27.5 * 2^(ii/12);
end

我命名循环变量的原因ii是因为i是内置函数的名称。因此,将其用作变量名被认为是不好的做法。

此外,在您的描述中,您说过要迭代 88 次,但上述循环仅迭代 1 到 87 次(包括两者)。如果要迭代 88 次,请更改maxind为 88。

于 2013-09-11T23:25:21.280 回答