Цитата(pirri @ Nov 12 2009, 13:41)

Простите, но не понимаю я: на вход Сordic смесителя я подаю сигнал из Матлаб программы, сигнал, в котором нет этой составляющей (на спектре ее нет). Она появляется только после смещения на VHDL.
Занимаюсь ЦОС только 4 месяца, не судите строго

А вычисления потом целочисленные или в плавающей точке?
Если целочисленные, ибо кордик, то тогда так (наверное

) :
- при преобразовании float -> int делают так:
1. int = ( (1<<(N-1)) - 1 )*float, где N - число бит всего в целочисленном представлении сигнала.
2. Иногда еще к этому произведению добавляют 0.5 для округления обрезанием

3. в том и другом случае int_max + int_min == -1, т.е. сумма отсчетов синусоиды за период может быть не равна нулю.
Причем чем меньше амплитуда сигнала, равно как и маленькая разрядность числа (N) , тем больше может быть уровень постоянной составляющей.
Значит, на входе может быть постоянная составляющая, котороая, будучи умноженной на синус даст синус.
Далее... кордик... тоже вестч в себе:
- Операция x <= x - (y>>>n); (n - номер шага кордика) на каждом шаге дает ошибку, равно как и умножение на 0.60725... В самом простом случае вылезут спуры и их будет тем больше, чем меньше разрядность. Причем это не те спуры, которые получаются при табличной реализации синуса. Следовательно надо сначала проверить какие они и посмотреть какие комбинаторные составляющие они могут дать.
- Несколько помогает округление: xx <= x - ( (y + (1<<(n-1))) >>> n);
- dithering помогает хорошо, но надо хорошо посмотреть на выход. У меня, на первой реализации кордика получился плохой дизер и поползла постоянная составляющая. А она, умножаясь на синус сигнала дает палку в спектре выходного сигнала.
В плавающей точке, наверное, могут наблюдаться те же эффекты...
Только вопрос - ну видна палка на частоте гетеродина, ну и что? Если сигнал переносится в частоту ноль (или около того), то точно совершенно его полоса меньше частоты IF. На выходе уже перенесенный сигнал отфильтровать в своей полосе и счастье будет рядом

Из опыта лишь могу добавить, что в случае большого усиления после смесителя, мне пришлось для избавления от постоянной составляющей (-120дБ от уровня сигнала... я, типа, извращенец) всякими хитрыми способами переделывать округления промежуточных результатов, использовать округление в кордике и делать смещенное округление в первом фильтре как:
Код
assign out_i = (x3_i[DON-1-COMB_RID_3] == 1'b0) ? (x3_i[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA] + x3_i[DON-COMB_RID_3-DDA-1]) : (x3_i[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA]);// - x3_i[DON-COMB_RID_3-DDA-1]);
assign out_q = (x3_q[DON-1-COMB_RID_3] == 1'b0) ? (x3_q[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA] + x3_q[DON-COMB_RID_3-DDA-1]) : (x3_q[DON-1-COMB_RID_3 : DON-COMB_RID_3-DDA]);// - x3_q[DON-COMB_RID_3-DDA-1]);
т.е. отрицательные числа округлять, а положительные не трогать.