📄 fftlab.c
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. *//*********************** self documentation **********************//* * FFTLAB - Motif-X based graphical 1D Fourier Transform * * Usage: fftlab * * Caveat: you must have the Motif Developer's package to install this code *//**************** end self doc ********************************//* * Credits: Dave Hale */#include "Xmcwp/Xmcwp.h"typedef struct { Samples *r,*i;} CSamples;/* GLOBAL VARIABLES USED INTERNALLY */static Samples *fReal; /* real part of f */static Samples *fImag; /* imaginary part of f */static Samples *gReal; /* real part of g */static Samples *gImag; /* imaginary part of g */static CSamples *fComplex; /* complex samples f */static CSamples *gComplex; /* Fourier transform of f */static int nSamples; /* number of samples */static int originCentered; /* non-zero if origin at nSamples/2 *//* FUNCTIONS USED INTERNALLY */static void CreateApplication (Widget parent);static void editingCB (int selected, void *callData);static void lengthCB (int selected, void *callData);static void originChangeCB (Widget w, char * client_data, char * call_data);static void zeroAllCB (Widget w, char * client_data, char * call_data);static void quitCB (Widget w, char * client_data, char * call_data);static void editDone (Samples *s);static void newData (Samples *s);static void zeroData (Samples *s);static void transform (CSamples *this_fft, CSamples *that_fft);static float determinePlotValue (CSamples *cs);static void shiftOrigin (Samples *s);static void fftcc(int sign, int n, complex cc[]);/* main program */intmain (int argc, char **argv){ Widget app; /* initialize toolkit */ app = XtInitialize(argv[0],"Fftlab",NULL,0,&argc,argv); /* create and realize the application */ CreateApplication(app); XtRealizeWidget(app); /* handle events */ XtMainLoop(); return(EXIT_SUCCESS); /* not reached */}/* create all application widgets */static void CreateApplication (Widget parent){ int n; XmString labels; Widget win,frame,framee,framel,formo,formw,form,label,pushb,toggleb; Arg args[20]; int nEditingButtons=4; char *editingButtons[] = {"Draw","Negate","Zero","None"}; int nLengthButtons=3; static int lengths[]={16,32,64}; char *lengthButtons[]={"16","32","64"}; /* create main window */ n = 0; win = XmCreateMainWindow(parent,"",args,n); XtManageChild(win); /* create form widget to hold options panel and complex samples */ n = 0; formw = XmCreateForm(win,"",args,n); XtManageChild(formw); /* create options panel */ n = 0; XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNtopOffset,2); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNbottomOffset,2); n++; formo = XmCreateForm(formw,"",args,n); XtManageChild(formo); framee = XtcwpCreateStringRadioButtons(formo,"Editing", nEditingButtons,editingButtons,0, editingCB,NULL); XtManageChild(framee); framel = XtcwpCreateStringRadioButtons(formo,"Length", nLengthButtons,lengthButtons,0, lengthCB,lengths); XtManageChild(framel); n = 0; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,framee); n++; XtSetArg(args[n],XmNtopOffset,10); n++; XtSetValues(framel,args,n); n = 0; XtSetArg(args[n],XmNlabelType,XmSTRING); n++; labels = XmStringCreateLtoR("Origin\nCentered",CHARSET); XtSetArg(args[n],XmNlabelString,labels); n++; XtSetArg(args[n],XmNalignment,XmALIGNMENT_BEGINNING); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,framel); n++; XtSetArg(args[n],XmNtopOffset,10); n++; toggleb = XmCreateToggleButtonGadget(formo,"",args,n); XtManageChild(toggleb); XtAddCallback( (Widget) toggleb, XmNvalueChangedCallback, (XtCallbackProc) originChangeCB, (XtPointer) NULL); n = 0; XtSetArg(args[n],XmNlabelType,XmSTRING); n++; labels = XmStringCreateLtoR("Zero All",CHARSET); XtSetArg(args[n],XmNlabelString,labels); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,toggleb); n++; XtSetArg(args[n],XmNtopOffset,10); n++; pushb = XmCreatePushButtonGadget(formo,"",args,n); XtManageChild(pushb); XtAddCallback( (Widget) pushb, XmNactivateCallback, (XtCallbackProc) zeroAllCB, (XtPointer) NULL); n = 0; XtSetArg(args[n],XmNlabelType,XmSTRING); n++; labels = XmStringCreateLtoR("Quit",CHARSET); XtSetArg(args[n],XmNlabelString,labels); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNbottomOffset,2); n++; pushb = XmCreatePushButtonGadget(formo,"",args,n); XtManageChild(pushb); XtAddCallback( (Widget) pushb, XmNactivateCallback, (XtCallbackProc) quitCB, (XtPointer) NULL); /* allocate space for complex f and g */ fComplex = (CSamples*)malloc(sizeof(CSamples)); gComplex = (CSamples*)malloc(sizeof(CSamples)); /* create complex f */ n = 0; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNleftWidget,formo); n++; XtSetArg(args[n],XmNleftOffset,5); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNtopOffset,2); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_POSITION); n++; XtSetArg(args[n],XmNbottomPosition,50); n++; frame = XmCreateFrame(formw,"",args,n); XtManageChild(frame); n = 0; form = XmCreateForm(frame,"",args,n); XtManageChild(form); n = 0; XtSetArg(args[n],XmNlabelType,XmSTRING); n++; labels = XmStringCreateLtoR("f(x)",CHARSET); XtSetArg(args[n],XmNlabelString,labels); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNtopOffset,2); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; label = XmCreateLabelGadget(form,"label",args,n); XtManageChild(label); fComplex->r = fReal = samplesCreate(form,"Real",editDone); fComplex->i = fImag = samplesCreate(form,"Imaginary",editDone); n = 0; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,label); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION); n++; XtSetArg(args[n],XmNrightPosition,50); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNbottomOffset,2); n++; XtSetValues(fReal->frame,args,n); n = 0; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,label); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION); n++; XtSetArg(args[n],XmNleftPosition,50); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNbottomOffset,2); n++; XtSetValues(fImag->frame,args,n); /* create complex g */ n = 0; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNleftWidget,formo); n++; XtSetArg(args[n],XmNleftOffset,5); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNbottomOffset,2); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_POSITION); n++; XtSetArg(args[n],XmNtopPosition,50); n++; frame = XmCreateFrame(formw,"",args,n); XtManageChild(frame); n = 0; form = XmCreateForm(frame,"",args,n); XtManageChild(form); n = 0; XtSetArg(args[n],XmNlabelType,XmSTRING); n++; labels = XmStringCreateLtoR("F(k)",CHARSET); XtSetArg(args[n],XmNlabelString,labels); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNtopOffset,2); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightOffset,2); n++; label = XmCreateLabelGadget(form,"",args,n); XtManageChild(label); gComplex->r = gReal = samplesCreate(form,"Real",editDone); gComplex->i = gImag = samplesCreate(form,"Imaginary",editDone); n = 0; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,label); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNleftOffset,2); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION); n++; XtSetArg(args[n],XmNrightPosition,50); n++; XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNbottomOffset,2); n++; XtSetValues(gReal->frame,args,n); n = 0; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopWidget,label); n++; XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION); n++; XtSetArg(args[n],XmNleftPosition,50); n++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -