最近研究语音通话功能,发现嵌入式设备上录制音量过小。
然后采用采样数据称除的算法进行音量条件,采集的语音数据或语音文件(语音PCM头要去除),语音数据声音增大算法:
01004EB6 |. BE 0080FFFF mov esi, FFFF8000
01004EBB |> /0FBF07 /movsx eax, word ptr [edi]
01004EBE |. |0FAFC1 |imul eax, ecx
01004EC1 |. |6A 64 |push 64
01004EC3 |. |99 |cdq
01004EC4 |. |5B |pop ebx
01004EC5 |. |F7FB |idiv ebx
01004EC7 |. |3BC6 |cmp eax, esi
01004EC9 |. |7D 04 |jge short 01004ECF
01004ECB |. |8BC6 |mov eax, esi
01004ECD |. |EB 10 |jmp short 01004EDF
01004ECF |> |BA FF7F0000 |mov edx, 7FFF
01004ED4 |. |3BC2 |cmp eax, edx
01004ED6 |. |7E 04 |jle short 01004EDC
01004ED8 |. |8BC2 |mov eax, edx
01004EDA |. |EB 03 |jmp short 01004EDF
01004EDC |> |0FBFC0 |movsx eax, ax
01004EDF |> |66:8907 |mov word ptr [edi], ax
01004EE2 |. |47 |inc edi
01004EE3 |. |47 |inc edi
01004EE4 |. |FF4D 08 |dec dword ptr [ebp+8]
01004EE7 |.^\75 D2 \jnz short 01004EBB
上面是微软录音机的代码。
下面是我改进的代码,以25%向上增加语音音量。
//buf就是要增大音量的语音数据。这里只是单声道
- void RaiseVolume(char* buf, UINT32 size,UINT32 uRepeat)
- {
- if (!size )
- {
- return;
- }
- for (int i = 0; i < size;)
- {
- signed long minData = -0x8000; 如果是8bit编码这里变成-0x80
- signed long maxData = 0x7FFF;如果是8bit编码这里变成0xFF
-
- signed short wData = buf[i+1];
- wData = MAKEWORD(buf[i],buf[i+1]);
- signed long dwData = wData;
-
- for (int j = 0; j < uRepeat; j++)
- {
- dwData = dwData * 1.25;
- if (dwData < -0x8000)
- {
- dwData = -0x8000;
- }
- else if (dwData > 0x7FFF)
- {
- dwData = 0x7FFF;
- }
- }
- wData = LOWORD(dwData);
- buf[i] = LOBYTE(wData);
- buf[i+1] = HIBYTE(wData);
- i += 2;
- }
- }
(cr0_3) |