У Blackfin+ (не путать с Blackfin) два 40-разрядных аккумулятора A1,A0 и три умножителя: один (MAC10) - 32-х битный и два (MAC1,MAC0) - 16-ти битные. "Но есть нюансы.." :) В контексте задачи ГКЧ, как уже отметил argus98, использовать 16-ти битную арифметику допустимо только для сравнительно коротких последовательностей сигнала. Проблема в том, что многие рекурсивные методы приводят в процессе счета к накоплению ошибки. При расчете одного периода гармоники это, как правило, особой роли не играет, так как для генерации одного периода гармоники обычно достаточно относительно небольшого числа семплов. В примере MBedder'а их всего 256. После этого рекурсия возвращается к своим начальным значениям и накопленная в процессе счета ошибка обнуляется. Но если считать рекурсивным способом сигнал ГКЧ, то здесь, как правило требуется довольно длинная последовательность семплов, возможно, это будет несколько сот тысяч семплов. Связано это с тем, что сигнал ГКЧ зачастую должен иметь большое количество "периодов" гармоники с нарастающей частотой и на относительно длинном интервале времени. Если считать, что самый короткий гармонический интервал требует для восстановления, скажем, 256 точек и таких интервалов в импульсе ГКЧ около 1000, то вся последовательность окажется весьма длинной.. Чтобы накопленная к моменту окончания импульса ГКЧ ошибка была небольшой, при расчете семплов ГКЧ необходимо применять 32-х битную арифметику. В этой связи, ADI уже "подсуетился" и новые процессоры BF70x уже умеют умножать два 32-х битных числа за один такт с накоплением 64-х битного результата в паре аккумуляторов A1,A0:
The 32-bit multiplier, MAC10, has two 32-bit operands which can be in any Data register in the Data
Register File. The multiplier can accumulate results in the register pair A1:0. The accumulator results are
saturated to 72 bits. The 64-bit multiplier result can also be written directly to a data register pair or
rounded or truncated to 32-bits and written to a Data Register.
С использованием этого умножителя код в цикле должен выглядеть примерно так:
A1:0 = Dreg * Dreg; // cost*cosw;
Dreg = (A1:0 -= Dreg * Dreg); // - sint*sinw;
A1:0 = Dreg * Dreg; // cost*sinw;
Dreg = (A1:0 += Dreg * Dreg); // + sint*cosw;
A1:0 = Dreg * Dreg; // cosw*cosdw;
Dreg = (A1:0 -= Dreg * Dreg); // - sinw*sindw;
A1:0 = Dreg * Dreg; // cosw*sindw;
Dreg = (A1:0 += Dreg * Dreg); // + sinw*cosdw;
+ пересылки: RAM<->PPI
В итоге, где-то в 10 ассемблерных команд все это должно уложиться, КМК..
Ну и не забываем, что BF706 работают на частоте 400 МГц, потребляя при этом 90 мка/МГц.
См. ADSP-BF70x_Blackfin_Programming_Reference.pdf /стр. 76/