📄 module.asm
字号:
.CONST
Buffsz EQU 32*1024
;-------------------------------------------------------------------------------------
.DATA?
Align 4
WaveStart DD ?
BytesLeft DD ?
FileOpenedFlag DD ?
wavHnd DD ?
wFlHnd DD ?
WFileSz DD ?
Counter DD ?
sAdd DD ?
rexMem DD ?
imxMem DD ?
magMem DD ?
phsMem DD ?
.DATA
Align 4
HPFlag DD 0
LPFlag DD 0
DispFlag DD 0
LpVal DD 32
HpVal DD 400
.CODE
;-------------------------------------------------------------------------------------
Open Macro
.DATA?
Align 4
Temp1 DB 20 DUP(?)
.DATA
TmpStrT DB "Error in Opening File",0
TmpStr DB "Not a Wave file",0
.CODE
Invoke FillBuffer,Addr szFileName,length szFileName,0
Invoke GetFileName,hWnd,cStr("Open ASM"),cStr("Wave Files",0,"*.Wav",0,"All Files",0,"*.*",0,0)
.If eax!=0
FileOpenPtr szFileName
mov wFlHnd,eax
mov WFileSz,@FileSize(eax)
mov BytesLeft,eax
FileRead wFlHnd,Offset Temp1,20
mov edi,Offset Temp1
cmp Dword Ptr[edi],"FFIR"
jne ErW
cmp Dword Ptr[edi+8],"EVAW"
jne ErW
cmp Dword Ptr[edi+12]," tmf"
jne ErW2
pusha
mov ebx,[edi+16]
FileRead wFlHnd,Offset pWavFmt,[edi+16]
mov edi,[edi+16]
add edi,20+8
mov WaveStart,edi
WavInit44St
mov FileOpenedFlag,1
popa
jmp ErW2
ErW: Invoke MessageBox,0,Addr TmpStr,Addr TmpStrT,MB_OK or MB_ICONERROR
ErW2: nop
.Else
mov FileOpenedFlag,0
.EndIf
EndM
;---------------------------------------------------------------------
Disp Proc pMagMem:Dword
.DATA
adVal DD 150
adCnt DD 4
adCnt2 DD 4
.CODE
push eax
Box 0,0,800,600,0ffffffh
Line 0,adVal,0,adVal
mov eax,nmFFTspl
mov adCnt,eax
;add eax,eax
mov ebx,800
xor edx,edx
div ebx
mov edi, pMagMem ;imxMem ; ;rexMem
xor ebx,ebx
mov adVal,450
mov adCnt2,eax ;4
@@: movq MM0,[edi]
pf2id MM0,MM0
psrad MM0,12
movd eax,MM0
mov esi,adVal
sub esi,eax
;Line ebx,adVal,ebx,esi
Line ,,ebx,esi
;punpckhdq MM0,MM0
;movd eax,MM0
;mov ecx,adVal
;add ecx,140
;mov esi,ecx
;sub esi,eax
;Line ebx,ecx,ebx,esi
inc ebx
add edi,8
dec adCnt
jz @f
cmp ebx,800
jb @b
mov ebx,0
add adVal,100
Line 0,adVal,0,adVal
dec adCnt2
jnz @b
@@: pop eax
Invoke ReleaseDC,dishnd,eax
ret
Disp EndP
;---------------------------------------------------------------------
;Low frequency cut off
;---------------------------------------------------------------------
LfreqCutOff Macro
Local @ex
mov ebx,rexMem
mov ecx,nmFFTspl
mov edx,imxMem
mov edi,nmFFTspl
shr ecx,11
mov eax,LpVal
shl edi,3
pxor MM0,MM0
shl eax,cl
or eax,eax
jz @ex
sub edi,8
@@: movq [ebx],MM0
movq [edx],MM0
movq [ebx+edi],MM0
movq [edx+edi],MM0
add ebx,8
add edx,8
sub edi,16
dec eax
jnz @b
@ex:
EndM
;--------------------------------------------------------------------------
;High frequency cut off
;--------------------------------------------------------------------------
HfreqCutOff Macro
Local @ex
mov ecx,nmFFTspl
mov ebx,rexMem
shl ecx,2
mov edx,imxMem
add ebx,ecx
add edx,ecx
sub ebx,8
sub edx,8
shr ecx,13
mov eax,HpVal ;400
shl eax,cl
or eax,eax
jz @ex
mov edi,8
pxor MM0,MM0
@@: movq [ebx],MM0
movq [edx],MM0
movq [ebx+edi],MM0
movq [edx+edi],MM0
sub ebx,8
sub edx,8
add edi,16
dec eax
jnz @b
@ex:
EndM
;--------------------------------------------------------------------------
pFFT Proc src:Dword,dest:Dword ;N:req,
pusha
mov sAdd,0
@ifm: Invoke FFT,src,rexMem,imxMem
.If HPFlag==1
HfreqCutOff
.EndIf
.If LPFlag==1
LfreqCutOff
.EndIf
.If DispFlag==1
Invoke RectToPol,rexMem,imxMem,magMem,phsMem
Invoke Disp,magMem
.EndIf
Invoke IFFT,dest,rexMem,imxMem
mov ecx,nmFFTspl
shl ecx,2
add src,ecx
add dest,ecx
inc sAdd
mov ebx,sAdd
mov eax,Buffsz
mov edx,0
div ecx
cmp ebx,eax
jbe @ifm
popa
ret
pFFT EndP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -