Конференция "Media" » One ASM command only!
 
  • AndreyRus © (19.03.10 01:16) [0]
    Reset!
    Целый вечер посвятил одной проблеме и так и не решил...

    8-битный звук отдается звуковухой в формате:

    255
    128 - тишина
    0

    16-битный:
    32768
    0 - тишина
    -32768

    Как одной командой микропроцессора максимальную амплитуду сигнала конвертировать(эмулировать) из 8-бит в 16 (т.е. от 0 до 32767)?
  • AndreyRus © (19.03.10 01:23) [1]

    > 16-битный:
    > 32768


    16-битный:
    32767
    tnx
  • MBo © (19.03.10 08:07) [2]
    умножить на 256?
  • AndreyRus © (19.03.10 10:40) [3]
    Форматы хранения данных разные...
  • Дмитрий Белькевич (19.03.10 11:29) [4]
    Сдвинуть 255-128-0 в 128..-127 и умножить на 256.
  • MBo © (19.03.10 15:14) [5]
    одной командой не получится.
    А двумя - xor $80 и сдвиг влево на 8
  • AndreyRus © (20.03.10 11:44) [6]
    По сути - нужно увеличить быстродействие строки:

    CurrentAmplitude:= Abs(byte(PWaveHDR(msg.lParam).lpData[i]) - 128) * 256;

  • MBo © (20.03.10 13:19) [7]
    b: Byte;
     s: SmallInt;
    begin
       s := b xor $80;
       s := s shl 8;
  • AndreyRus © (21.03.10 16:09) [8]

    var
     b: Byte;
     s: SmallInt;
    begin
     s := b xor $80;
     s := s shl 8;



    Может и быстрее чем:

    CurrentAmplitude:= Abs(byte(PWaveHDR(msg.lParam).lpData[i]) - 128) * 256;



    но не намного. По идее нужно MMX использовать. Может кто знает как?
  • MBo © (22.03.10 07:39) [9]
    понадобятся команды
    movd
    pxor
    punpcklbw
    psllw
    movq
  • Дмитрий Белькевич (23.03.10 01:00) [10]
    сделать:

    with PWaveHDR(msg.lParam) do
    CurrentAmplitude := (byte(lpData[i]) xor $80) * 256;

    будет быстрее. умножение компайлер сам на сдвиг заменит.

    MMX - можно, если сильно нужно, будет еще в 2 - 2.5 раза быстрее. читай маны - в mmx'е ничего сверхъестественного (если basm знаешь) - биты везде одинаковые.

    лучше на mmx'е делать не только цикл, а всю обвязку, которая работает с CurrentAmplitude - можно получить ускорение еще больше, только (b xor 80) shl 8 выигрыша большого не даст - теряется время на распаковку/упаковку данных.
  • murder (25.03.10 12:33) [11]
    /Мне кажется что нужен не xor, а sub
    //CurrentAmplitude := (byte(lpData[i]) - $80) * 256;
    procedure convert8to16(lpData,Ampplitude: pointer;dataSize: dword);assembler;register;
    asm
    add     eax,ecx
    lea     edx,[edx+ecx*2]
    neg     ecx
    pcmpeqw mm1,mm1
    psllw   mm1,15
    @1:movd      mm0,[eax+ecx]
      punpcklbw mm0,mm0
      psllw     mm0,8
      psubw     mm0,mm1
      movq      [edx+ecx*2],mm0
      add       ecx,4
    jne @1
    emms
    end;

  • Дмитрий Белькевич (28.03.10 18:25) [12]

    > procedure convert8to16(lpData,Ampplitude: pointer;dataSize:
    >  dword);assembler;register;


    1. размер входных данных должен быть кратен четырём. И выходных - восьми.

    2. Что-то мне кажется, что так мы посчитаем (byte(lpData[i]) * 256) - $80  а не (byte(lpData[i]) - $80) * 256.
 
Конференция "Media" » One ASM command only!
Есть новые Нет новых   [120013   +36][b:0][p:0.001]