ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
613597 Топик полностью
USSR (11.08.2015 20:35, просмотров: 1) ответил Крок на Сопсно, спич об том и зашёл. Даст ли Вижуал ДСП код, который будет достаточно короток? Хотя, конечно, по-любому два умножителя лучше, чем один. А аккумуляторов 40-разрядных у него сколько?
У 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/