Я пытаюсь перевести подпрограмму C из старой программы синтеза звука в R, но у меня есть проблемы с индексированием, которые я пытаюсь понять (я новичок, когда дело доходит до использования циклов). *
Подпрограмма создает экспоненциальную таблицу поиска - вектор exptab
:
# Define parameters
sinetabsize <- 8192
prop <- 0.8
BP <- 10
BD <- -5
BA <- -1
# Create output vector
exptab <- vector("double", sinetabsize)
# Loop
while(abs(BD) > 0.00001){
BY = (exp(BP) -1) / (exp(BP*prop)-1)
if (BY > 2){
BS = -1
}
else{
BS = 1
}
if (BA != BS){
BD = BD * -0.5
BA = BS
BP = BP + BD
}
if (BP <= 0){
BP = 0.001
}
BQ = 1 / (exp(BP) - 1)
incr = 1 / sinetabsize
x = 0
stabsize = sinetabsize + 1
for (i in (1:(stabsize-1))){
x = x + incr
exptab [[sinetabsize-i]] = 1 - (BQ * (exp(BP * x) - 1))
}
}
Выполнение кода дает ошибку:
Error in exptab[[sinetabsize - i]] <- 1 - (BQ * (exp(BP * x) - 1)) :
attempt to select less than one element in integerOneIndex
Что, как я понимаю, глядя на другие сообщения, указывает на проблему с индексированием. Но мне трудно решить точную проблему.
Я подозреваю, что ошибка может быть ie в моем переводе. Исходный код C для последних нескольких строк:
for (i=1; i < stabsize;i++){
x += incr;
exptab[sinetabsize-i] = 1.0 - (float) (BQ*(exp(BP*x) - 1.0));
}
Я думал, что код R for (i in (1:(stabsize-1)))
эквивалентен C коду for (i=1; i< stabsize;i++)
(т.е. начальное значение i равно i = 1
, проверка есть ли i < stabsize
, а приращение равно +1). Но сейчас я не так уверен.
Любые предложения относительно того, где я ошибаюсь, будут очень признательны!