⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.asm

📁 一个不错的用汇编语言编写的FFT算法程序
💻 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 + -