This is smsClean.c in view mode; [Download] [Up]
/* * * main program for smsClean * */ #include "../sms.h" #define USAGE "Usage: smsClean <inputSmsFile> <outputSmsFile>" void SearchSms (SMS_DATA smsData, float *pFFreq, int *pIGoodRecords) { int i; for (i = 0; i < smsData.nTraj; i++) if (smsData.pFMagTraj[i] > 0) { pFFreq[i] += smsData.pFFreqTraj[i]; pIGoodRecords[i]++; } } int calcRecordBSize (SMSHeader *pSmsHeader, int nTrajectories) { int iSize = 0, nGain = 1, nComp = 2; if (pSmsHeader->iStochasticType == STOC_NONE) nGain = 0; if (pSmsHeader->iFormat == FORMAT_HARMONIC_WITH_PHASE || pSmsHeader->iFormat == FORMAT_INHARMONIC_WITH_PHASE) nComp = 3; iSize = sizeof (float) * (nComp * nTrajectories + pSmsHeader->nStochasticCoeff + nGain); return(iSize); } void setTraj (float *pFFreq, int inNTraj, int *pITrajOrder, int outNTraj) { int i, j, iTraj; float fTmp = 22000, fLow = 0; for (i = 0; i < outNTraj; i++) { for (j = 0; j < inNTraj; j++) { if (pFFreq[j] > fLow) fTmp = MIN (pFFreq[j], fTmp); if (fTmp == pFFreq[j]) iTraj = j; } fLow = fTmp; fTmp = 22000; pITrajOrder[i] = iTraj; } } void cleanSms (SMS_DATA inSmsData, SMS_DATA *pOutSmsData, int *pITrajOrder) { int iTraj, iCoeff; for (iTraj = 0; iTraj < pOutSmsData->nTraj; iTraj++) { pOutSmsData->pFFreqTraj[iTraj] = inSmsData.pFFreqTraj[pITrajOrder[iTraj]]; pOutSmsData->pFMagTraj[iTraj] = inSmsData.pFMagTraj[pITrajOrder[iTraj]]; } if (inSmsData.nCoeff > 0) { pOutSmsData->nCoeff = inSmsData.nCoeff; *(pOutSmsData->pFStocGain) = *(inSmsData.pFStocGain); for (iCoeff = 0; iCoeff < pOutSmsData->nCoeff; iCoeff++) pOutSmsData->pFStocCoeff[iCoeff] = inSmsData.pFStocCoeff[iCoeff]; } } void main (int argc, char *argv[]) { char *pChInputSmsFile = NULL, *pChOutputSmsFile = NULL, *pChProgramName; SMSHeader *pInSmsHeader, *pOutSmsHeader; char *pInData, *pOutData; float *pFFreq; SMS_DATA inSmsData, outSmsData; int iError, *pIGoodRecords, *pITrajOrder, iRecord, iGoodTraj = 0, iTraj, iRecordBSize, iHeadBSize, iDataBSize; /* get user arguments */ pChProgramName = argv[0]; if (argc != 3) quit(USAGE); pChInputSmsFile = argv[1]; pChOutputSmsFile = argv[2]; if ((iError = readSmsFile (pChInputSmsFile, &pInSmsHeader)) < 0) { if (iError == SMS_NOPEN) quit ("cannot open file"); if (iError == SMS_RDERR) quit("read error"); if (iError == SMS_NSMS) quit ("not an SMS file"); if (iError == SMS_MALLOC) quit ("cannot allocate memory"); quit ("error"); } if ((pFFreq = (float *) calloc (pInSmsHeader->nTrajectories, sizeof (float))) == NULL) quit ("error allocating memory for pFFreq"); if ((pIGoodRecords = (int *) calloc (pInSmsHeader->nTrajectories, sizeof (int))) == NULL) quit ("error allocating memory for pIGoodRecords"); initSms (&inSmsData); pInData = (char *) pInSmsHeader + pInSmsHeader->iHeadBSize; for (iRecord = 1; iRecord < pInSmsHeader->nRecords; iRecord++) { setSmsRecord (pInSmsHeader, pInData, &inSmsData); SearchSms (inSmsData, pFFreq, pIGoodRecords); pInData += pInSmsHeader->iRecordBSize; } for (iTraj = 0; iTraj < pInSmsHeader->nTrajectories; iTraj++) if (pIGoodRecords[iTraj] > 0) { iGoodTraj++; pFFreq[iTraj] /= pIGoodRecords[iTraj]; } iRecordBSize = calcRecordBSize (pInSmsHeader, iGoodTraj); iHeadBSize = sizeof(SMSHeader); iDataBSize = iRecordBSize * pInSmsHeader->nRecords; /* allocate virtual memory for SMS file */ if ((pOutSmsHeader = (SMSHeader *) malloc ((size_t)(iHeadBSize+iDataBSize))) == NULL) quit("error allocating memory for SMS file"); initSmsHeader (pOutSmsHeader); pOutSmsHeader->iRecordBSize = iRecordBSize; pOutSmsHeader->nRecords = pInSmsHeader->nRecords; pOutSmsHeader->iFormat = pInSmsHeader->iFormat; pOutSmsHeader->iFrameRate = pInSmsHeader->iFrameRate; pOutSmsHeader->iStochasticType = pInSmsHeader->iStochasticType; pOutSmsHeader->nTrajectories = iGoodTraj; pOutSmsHeader->nStochasticCoeff = pInSmsHeader->nStochasticCoeff; pOutSmsHeader->pChDataRecords = (char *)pOutSmsHeader + pOutSmsHeader->iHeadBSize; pOutSmsHeader->fOriginalSRate = pInSmsHeader->fOriginalSRate; pOutSmsHeader->nTextCharacters = pInSmsHeader->nTextCharacters; pOutSmsHeader->pChTextCharacters = pInSmsHeader->pChTextCharacters; pOutData = (char *) pOutSmsHeader + pOutSmsHeader->iHeadBSize; initSms (&outSmsData); pInData = (char *) pInSmsHeader + pInSmsHeader->iHeadBSize; initSms (&inSmsData); if ((pITrajOrder = (int *) calloc (pOutSmsHeader->nTrajectories, sizeof (int))) == NULL) quit ("error allocating memory for pITrajOrder"); setTraj (pFFreq, pInSmsHeader->nTrajectories, pITrajOrder, pOutSmsHeader->nTrajectories); for (iRecord = 1; iRecord < pOutSmsHeader->nRecords; iRecord++) { setSmsRecord (pOutSmsHeader, pOutData, &outSmsData); setSmsRecord (pInSmsHeader, pInData, &inSmsData); cleanSms (inSmsData, &outSmsData, pITrajOrder); pOutData += pOutSmsHeader->iRecordBSize; pInData += pInSmsHeader->iRecordBSize; } writeSmsFile (pChOutputSmsFile, pOutSmsHeader); free (pInSmsHeader); free (pOutSmsHeader); free (pFFreq); free (pIGoodRecords); free (pITrajOrder); exit (0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.