БИХ фильтр на MMX (Помогите доделать прогу.)

Модератор: Модераторы разделов

Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

БИХ фильтр на MMX

Сообщение Slimy »

Прошу помочь разобратся в организации фильтра с применеине ммх процессора. на С все просто как я понял

Код: Выделить всё

 double  yn = 0.6*xn-0.6*xn_1+1.32*yn_1-1.35*yn_2;

Хотя может тут есть специалисты в цифровой обработке сигналов и хотел узнать каким образом рассичтываются коэффициенты? Был в гугле там трехэтажные формулы и подчти нет объянений не может же быть все так сложно. И большинство информации по КИХ фильру про БИХ очень мало.
Проблема еще в типах данныйх ММХ работает с целыми числами а тут вещественные как тут быть? Попробовал решить на осонве тог очто есть граффик вообще странный получился.

Код: Выделить всё

           __int64 a1 = 132, a2 = 135, b1 = 60,b2 = 60;
         unsigned __int64 iMask, mem1,mem2,mem3;
         __int32 mem32_1=0;
         __int16 iTmp=0, yn_2=0,yn_1=ys,xn;

            mem1 = mem2 = 0;
        iMask = 0;


        yn_2 = (__int16)yn_1;
        yn_1 = (__int16)iTmp;
        mem1 = (b1 << 48) | (a1 << 32) | (b2 << 16) | a2;
                xn_1 = xn;
                xn=xs*100;       // âõîä Õ
        iMask = xn;
        iMask <<= 48;
        mem2 = iMask;
        iMask = 0;
        iMask =  yn_1;
        iMask <<= 32;
        mem2 |= (0x0000ffff00000000)&iMask;
        iMask = 0;
        iMask = xn_1;
        iMask <<= 16;
        mem2 |= (0x00000000ffff0000)&iMask;
        iMask = yn_2;
        mem2 |= (0x000000000000ffff)&iMask;
        asm{
            movq mm0, mem2
            movq mm1, mem1
            movq mm2, mem1
            pmullw mm1, mm0  // ìëàäøèå ñëîâà â mm1
            pmulhw mm2, mm0  // ñòàðøèå ñëîâà â mm2
            movq mm0, mm1
            punpcklwd mm0, mm2    // b2*xn_1 | a2*yn_2 //
            movq mm3, mm1
            punpckhwd mm3, mm2    // b1*xn   | a1*yn_1 //
            psubd mm3, mm0
            movq mm1, mm3
            psrlq mm1, 32
            paddd mm1, mm3
            movd mem32_1, mm1
            emms
        }
        mem32_1 /= 100;
        iTmp = (signed __int16) mem32_1;    // Âûõîä ôèëüòðà
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: БИХ фильтр на MMX

Сообщение Slimy »

Так фильтр исправил вернее его формулу

Код: Выделить всё

 ymass[i] = (0.014401*xmass[i]+0.028803*xmass[i-1]+ 0.014401*xmass[i-2]-(-1.63299*ymass[i-1])-0.690599*ymass[i-2]);

Теперь не пойму как перевести это на MMX .Там вроде как я понял в один регистр сразу несколько значение загружается не понтяно как эт овсе не перемешивается и как перевести значени да еще сместить в регистре правильно?
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали: