-
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.