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

📄 ffttest.asm

📁 一个不错的用汇编语言编写的FFT算法程序
💻 ASM
字号:
 ;----------------------------------------------------------------------------------
.586
.387
.mmx
.k3d
.model flat, stdcall
option casemap:none
Include E:\masm32\Include\windows.inc
Include E:\masm32\Include\user32.inc
Include E:\masm32\Include\kernel32.inc
Include E:\masm32\Include\gdi32.inc
Include E:\masm32\Include\winmm.inc
Include E:\masm32\Include\comctl32.inc
IncludeLib E:\masm32\lib\Winmm.lib
Includelib E:\masm32\lib\user32.lib
Includelib E:\masm32\lib\kernel32.lib
IncludeLib E:\masm32\lib\gdi32.lib
IncludeLib E:\masm32\lib\comctl32.lib
include macros.asm
include filedlgs.asm
include wave.asm
include Display.asm
include FFT.asm
include module.asm

WinMain Proto :Dword,:Dword,:Dword,:Dword
WavProc Proto :Dword,:Dword,:Dword,:Dword,:Dword
Check3dNowCPU Proto
IdPlay   EQU  2000
IdPause  EQU  2001
IdStop   EQU  2002
IdOpen	 EQU  2003
IdHPass	 EQU  2004
IdLPass	 EQU  2005
IdDisp	 EQU  2006
IdTrHpass EQU 2007
IdTrLpass EQU 2008
.DATA
PauseFlag DD 0
FinFlag   DD 0
ClassName DB "FFT",0
SliderNm  DB "msctls_trackbar32",0
ButtonCNm DB "Button",0
Align 8
;----------------------------------------------------------------------------------
.DATA?
hInstance   DD ?
CommandLine DD ?
nmHdrWav    DD ?
hPlay       DD ?
hPause      DD ?
hStop       DD ?
hOpen		DD ?
hHPass		DD ?
hLPass		DD ?
hDisp		DD ?
hTrHpass	DD ?
hTrLpass	DD ?
;----------------------------------------------------------------------------------
.CODE
start:	
	Invoke GetModuleHandle, NULL
	mov    hInstance,eax
	Invoke GetCommandLine
	mov    CommandLine,eax
	call Check3dNowCPU
	.If eax==0
	    Invoke MessageBox,0,cStr("This programme needs 3dNow! processor"),cStr("Error"),MB_OK or MB_ICONERROR
	    jmp @f
	.EndIf
	Invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
@@:	Invoke ExitProcess,eax
	
;----------------------------------------------------------------------------------
WinMain Proc hInst:Dword,hPrevInst:Dword,CmdLine:LPSTR,CmdShow:Dword
	Local wc:WNDCLASSEX
	Local msg:MSG
	Local hwndM:Dword
	mov   wc.cbSize,Sizeof WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, Offset WndProc
	mov   wc.cbClsExtra,0
	mov   wc.cbWndExtra,0
	push  hInstance
	pop   wc.hInstance
	mov   wc.hbrBackground,COLOR_WINDOW+1
	mov   wc.lpszMenuName,0	
	mov   wc.lpszClassName,Offset ClassName
	Invoke LoadIcon,NULL,IDI_APPLICATION
	mov   wc.hIcon,eax
	mov   wc.hIconSm,eax
	Invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	Invoke RegisterClassEx, Addr wc
 	Invoke CreateWindowEx,WS_EX_DLGMODALFRAME,Addr ClassName,cStr("FFT sample Band Pass wave player by Pradeepan"),\
            WS_POPUPWINDOW or WS_VISIBLE or WS_CAPTION,CW_USEDEFAULT,\
           CW_USEDEFAULT,500,200,NULL,NULL,\
           hInstance,NULL
	mov   hwndM,eax
	Invoke UpdateWindow, hwndM
	.While TRUE
		Invoke GetMessage, Addr msg,0,0,0
		.Break .If (!eax)
		Invoke TranslateMessage, Addr msg
		Invoke DispatchMessage, Addr msg
	.EndW
	mov     eax,msg.wParam
	ret
WinMain EndP
 
;----------------------------------------------------------------------------------
WndProc Proc hWnd:Dword, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Local mnHdr:NMHDR
Local ps:PAINTSTRUCT
	.If uMsg==WM_DESTROY
 	    Invoke waveOutClose,WOpenHnd
        VMfree WavDblBuff,1
  	    VMfree WavBuff2,1
  	    CloseHnd wFlHnd,1
		Invoke PostQuitMessage,NULL
	.ElseIf uMsg==WM_COMMAND
	    mov eax,wParam
	    and eax,0ffffh
 	    .If eax==IdOpen
   	        mov PauseFlag,4
	        Invoke waveOutReset ,WOpenHnd
            Invoke waveOutClose,WOpenHnd
            mov PauseFlag,0
            VMfree WavDblBuff,1
  	        VMfree WavBuff2,1
  	        CloseHnd wFlHnd,1
  	        Invoke SendMessage,hPlay,BM_SETCHECK,0,0
 	        Invoke SendMessage,hPause,BM_SETCHECK,0,0
 	        Open
 	    .ElseIf eax==IdPlay
 	        .If PauseFlag==1
 	            mov PauseFlag,0
  	            Play
 	        .Else
 	            .If PauseFlag==3
 	                Invoke SendMessage,hPlay,BM_SETCHECK,1,0
 	            .ElseIf PauseFlag==2
  	                mov PauseFlag,0
  	                Invoke waveOutRestart,WOpenHnd
 	            .Else
 	                .If FileOpenedFlag==1
                        mov PauseFlag,3
 	                    Play
 	                .Else
 	                    Invoke SendMessage,hPlay,BM_SETCHECK,0,0
 	                .EndIf
 	            .EndIf
 	        .EndIf
 	    .ElseIf eax==IdPause
 	        .If PauseFlag==2
 	            Invoke SendMessage,hPause,BM_SETCHECK,1,0
 	        .Else
 	            mov PauseFlag,2
 	            Invoke waveOutPause,WOpenHnd
 	            Invoke SendMessage,hPlay,BM_SETCHECK,0,0
 	        .EndIf
 	    .ElseIf eax==IdStop
   	        mov PauseFlag,4
    	    Invoke waveOutReset,WOpenHnd
    	    mov PauseFlag,1
            mov edx,WavBuff2
            mov WavPtr,eax
 	        Invoke SendMessage,hPlay,BM_SETCHECK,0,0
 	        Invoke SendMessage,hPause,BM_SETCHECK,0,0
 	        FileSeek wFlHnd,46,FILE_BEGIN,1
 	    .ElseIf eax==IdHPass
 	    	Invoke SendMessage,hHPass,BM_GETSTATE,0,0
 	    	.If eax==9
 	    		mov HPFlag,1
 	    	.Else
 	    		mov HPFlag,0
 	    	.EndIf
		.ElseIf eax==IdLPass
 	    	Invoke SendMessage,hLPass,BM_GETSTATE,0,0
 	    	.If eax==9
 	    		mov LPFlag,1
 	    	.Else
 	    		mov LPFlag,0
 	    	.EndIf
		.ElseIf eax==IdDisp
 	    	Invoke SendMessage,hDisp,BM_GETSTATE,0,0
 	    	.If eax==9
 	    		mov DispFlag,1
 	    	.Else
 	    		mov DispFlag,0
 	    	.EndIf
 	    .EndIf

 	.ElseIf uMsg==WM_CREATE
 		Invoke WinFFTMain,0,0,0,0
 		Invoke InitFFT,1024*2,Offset rexMem,Offset imxMem,Offset magMem,Offset phsMem	;initialize FFT with 1024 samples (only 16bit stereo samples- not number of bytes)
 		
 		
 	    SetWinBk 0ff9988h,hWnd    
 	    Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Play"),WS_VISIBLE or WS_CHILD or WS_BORDER or BS_PUSHBUTTON,50,20,50,32,hWnd,IdPlay,hInstance,0
 	    mov hPlay,eax
        Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Pause"),WS_VISIBLE or WS_CHILD or WS_BORDER or BS_PUSHBUTTON,110,20,50,32,hWnd,IdPause,hInstance,0
 	    mov hPause,eax
        Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Stop"),WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON,170,20,50,32,hWnd,IdStop,hInstance,0
 	    mov hStop,eax
 	    Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Open"),WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON,230,20,50,32,hWnd,IdOpen,hInstance,0
 	    mov hStop,eax
   	    Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Enable low freq cutoff"),BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,50,60,200,30,hWnd,IdLPass,hInstance,0
 	    mov hLPass,eax
 	    Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Enable High freq cutoff"),BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,50,100,200,30,hWnd,IdHPass,hInstance,0
 	    mov hHPass,eax
 	    Invoke CreateWindowEx,0,Addr ButtonCNm,cStr("Enable Display"),BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,50,140,200,30,hWnd,IdDisp,hInstance,0
 	    mov hDisp,eax
		Invoke CreateWindowEx,0,Addr SliderNm,0,WS_VISIBLE or WS_CHILD or TBS_AUTOTICKS,260,60,200,30,hWnd,IdTrLpass,hInstance,0
		mov hTrLpass,eax
	    Invoke SendMessage,eax,TBM_SETRANGE,1,02000000h
		Invoke CreateWindowEx,0,Addr SliderNm,0,WS_VISIBLE or WS_CHILD or TBS_AUTOTICKS,260,100,200,30,hWnd,IdTrHpass,hInstance,0
		mov hTrHpass,eax
		Invoke SendMessage,eax,TBM_SETRANGE,1,02000000h
		
	.ElseIf uMsg==WM_NOTIFY
 	    mov eax,wParam
 	    and eax,0ffffh
  	    .If eax==IdTrHpass
			Invoke SendMessage,hTrHpass,TBM_GETPOS,0,0
			mov HpVal,eax
		.ElseIf eax==IdTrLpass
			Invoke SendMessage,hTrLpass,TBM_GETPOS,0,0
			mov LpVal,eax
		.EndIf
 	.Else
		Invoke DefWindowProc,hWnd,uMsg,wParam,lParam		
		ret
	.EndIf
	xor eax,eax
	ret
WndProc EndP

;----------------------------------------------------------------------------------

WavProc Proc hwndW:Dword,uMsg:UINT,UserData:Dword,Param1:Dword,Param2:Dword
       .If uMsg==WOM_DONE && PauseFlag!=4
       			add WavPtr,Buffsz
              	mov eax,Param1
                Invoke waveOutWrite,WOpenHnd,Param1,Sizeof WAVEHDR
                mov ecx,Buffsz
                sub BytesLeft,ecx
                shl ecx,2
                add ecx,WavBuff2
       			.If WavPtr>=ecx
                    FileRead wFlHnd,WavBuff2,Buffsz*4
                    .If eax<(Buffsz*4)
                        mov esi,eax
                        FileSeek wFlHnd,46,FILE_BEGIN,1
                        mov edx,Buffsz*4
                        sub edx,esi
                        add esi,WavBuff2
                        mov ecx,Buffsz
                        sub ecx,edx
                        mov BytesLeft,ecx
                        FileRead wFlHnd,esi,edx
                    .EndIf
                    mov eax,WavBuff2
                    mov WavPtr,eax
                .EndIf
	            mov eax,Param1
                mov [eax].WAVEHDR.dwBufferLength,Buffsz
;                pusha
;                mov ecx,[eax].WAVEHDR.dwBufferLength
;                mov ebx,WavPtr
;                mov edi,[eax].WAVEHDR.lpData
;             	shr ecx,3
;@@:            		movq MM0,[ebx]
;             		movq [edi],MM0
;             		add ebx,8
;             		add edi,8
;				dec ecx
;				jnz @b
;               popa
               Invoke pFFT,WavPtr,[eax].WAVEHDR.lpData
                
      .ElseIf uMsg==WOM_CLOSE
        Invoke waveOutUnprepareHeader,WOpenHnd, Offset WavHdr,Sizeof WavHdr
        Invoke waveOutUnprepareHeader,WOpenHnd, Offset WavHdr2,Sizeof WavHdr
      .EndIf
    ret
WavProc EndP

;----------------------------------------------------------------------------------
Check3dNowCPU Proc
        pushfd
        pop eax
        mov ebx,eax
        xor eax,200000h
        push eax
        popfd
        pushfd
        pop eax
        cmp eax,ebx
        jz No3dNow

        mov eax,80000000h
        cpuid
        cmp eax,80000000h
        jbe No3dNow

        mov eax,80000001h
        cpuid
        mov eax,1
        test edx,80000000h
        jnz Yes3dNow
        
No3dNow: xor eax,eax
Yes3dNow: ret
Check3dNowCPU EndP

;----------------------------------------------------------------------------------
END start
;----------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -