summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sms.py24
-rw-r--r--sms/analysis.c20
-rw-r--r--sms/fileIO.c912
-rw-r--r--sms/fixTracks.c2
-rw-r--r--sms/peakDetection.c202
-rw-r--r--sms/sms.c922
-rw-r--r--sms/sms.h559
-rw-r--r--sms/sms.i8
-rw-r--r--sms/soundIO.c39
-rw-r--r--tests/sms.py934
10 files changed, 1810 insertions, 1812 deletions
diff --git a/sms.py b/sms.py
index 661218d..4eb53c0 100644
--- a/sms.py
+++ b/sms.py
@@ -33,14 +33,17 @@ class SMSPeakDetection(simpl.PeakDetection):
# analysis parameters
self._analysis_params = pysms.SMS_AnalParams()
self._analysis_params.iSamplingRate = self.sampling_rate
+ # set default hop and frame sizes to match those in the parent class
+ self._analysis_params.iFrameRate = self.sampling_rate / self._hop_size
self._analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
self._analysis_params.fHighestFreq = 20000
- #self._analysis_params.fLowestFundamental = 50
- #self._analysis_params.fDefaultFundamental = 100
- self._analysis_params.iMaxDelayFrames = 4
+ self._analysis_params.iMaxDelayFrames = 21#4
self._analysis_params.analDelay = 0
self._analysis_params.minGoodFrames = 1
+ self._analysis_params.iCleanTracks = 0
self._analysis_params.iFormat = pysms.SMS_FORMAT_HP
+ self._analysis_params.nTracks = self._max_peaks
+ self._analysis_params.maxPeaks = self._max_peaks
pysms.sms_initAnalysis(self._analysis_params)
self._peaks = pysms.SMS_SpectralPeaks(self.max_peaks)
# By default, SMS will change the size of the frames being read depending on the
@@ -48,12 +51,6 @@ class SMSPeakDetection(simpl.PeakDetection):
# behaviour (useful when comparing different analysis algorithms), set the
# _static_frame_size variable to True
self._static_frame_size = False
- # set default hop and frame sizes to match those in the parent class
- self._analysis_params.iFrameRate = self.sampling_rate / self._hop_size
- pysms.sms_changeHopSize(self._hop_size, self._analysis_params)
- self._analysis_params.fDefaultFundamental = float(self.sampling_rate)/self.frame_size
- self._analysis_params.fLowestFundamental = self._analysis_params.fDefaultFundamental
-
def __del__(self):
pysms.sms_freeAnalysis(self._analysis_params)
@@ -81,7 +78,6 @@ class SMSPeakDetection(simpl.PeakDetection):
def set_max_frequency(self, max_frequency):
self._analysis_params.fHighestFreq = max_frequency
- self._analysis_params.peakParams.fHighestFreq = max_frequency
def get_default_fundamental(self):
return self._analysis_params.fDefaultFundamental
@@ -112,26 +108,26 @@ class SMSPeakDetection(simpl.PeakDetection):
def set_min_frequency(self, min_frequency):
self._analysis_params.fLowestFundamental = min_frequency
- self._analysis_params.peakParams.fLowestFreq = min_frequency
+ self._analysis_params.fLowestFreq = min_frequency
def get_min_peak_amp(self):
return self._analysis_params.fMinPeakMag
def set_min_peak_amp(self, min_peak_amp):
self._analysis_params.fMinPeakMag = min_peak_amp
- self._analysis_params.peakParams.fMinPeakMag = min_peak_amp
def get_hop_size(self):
return self._analysis_params.sizeHop
def set_hop_size(self, hop_size):
- self._analysis_params.iFrameRate = self.sampling_rate / hop_size
+ #self._analysis_params.iFrameRate = self.sampling_rate / hop_size
pysms.sms_changeHopSize(hop_size, self._analysis_params)
def set_max_peaks(self, max_peaks):
# todo: compare to SMS_MAX_NPEAKS?
self._max_peaks = max_peaks
- self._analysis_params.peakParams.iMaxPeaks = max_peaks
+ self._analysis_params.nTracks = max_peaks
+ self._analysis_params.maxPeaks = max_peaks
self._peaks = pysms.SMS_SpectralPeaks(max_peaks)
def set_sampling_rate(self, sampling_rate):
diff --git a/sms/analysis.c b/sms/analysis.c
index 678eb13..84eb28c 100644
--- a/sms/analysis.c
+++ b/sms/analysis.c
@@ -31,21 +31,20 @@
/*! \brief maximum size for magnitude spectrum */
#define SMS_MAX_SPEC 8192
-void printPeakParams(SMS_PeakParams* params)
+void printAnalysisParams(SMS_AnalParams* params)
{
printf("fLowestFreq: %f\n"
"fHighestFreq: %f\n"
"fMinPeakMag: %f\n"
"iSamplingRate: %d\n"
"iMaxPeaks: %d\n"
- "nPeaksFound: %d\n"
"fHighestFundamental: %f\n"
"iRefHarmonic: %d\n"
"fMinRefHarmMag: %f\n"
"fRefHarmMagDiffFromMax: %f\n"
"iSoundType: %d\n",
params->fLowestFreq, params->fHighestFreq, params->fMinPeakMag, params->iSamplingRate,
- params->iMaxPeaks, params->nPeaksFound, params->fHighestFundamental, params->iRefHarmonic,
+ params->maxPeaks, params->fHighestFundamental, params->iRefHarmonic,
params->fMinRefHarmMag, params->fRefHarmMagDiffFromMax, params->iSoundType);
}
@@ -91,7 +90,7 @@ void sms_analyzeFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, sfloat fRe
pFMagSpectrum,
pFPhaSpectrum,
pCurrentFrame->pSpectralPeaks,
- &pAnalParams->peakParams);
+ pAnalParams);
/* find a reference harmonic */
if (pCurrentFrame->nPeaks > 0 &&
@@ -115,10 +114,10 @@ void sms_analyzeFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, sfloat fRe
*/
static int ReAnalyzeFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams)
{
- sfloat fFund, fLastFund, fDev;
+ sfloat fFund, fLastFund, fDev;
int iNewFrameSize, i;
sfloat fAvgDeviation = sms_fundDeviation(pAnalParams, iCurrentFrame);
- int iFirstFrame = iCurrentFrame - pAnalParams->minGoodFrames;
+ int iFirstFrame = iCurrentFrame - pAnalParams->minGoodFrames;
/*! \todo mae this a < 0 check, but first make sure sms_fundDeviation does not
return values below zero */
@@ -218,16 +217,17 @@ int sms_findPeaks(int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalPara
pAnalParams->sizeNextRead = MAX(0, (pAnalParams->windowSize+1)/2 - iExtraSamples);
ReAnalyzeFrame(iCurrentFrame, pAnalParams);
- /* return peaks */
+ /* save peaks */
pSpectralPeaks->nPeaksFound = pAnalParams->ppFrames[iCurrentFrame]->nPeaks;
- pSpectralPeaks->nPeaks = pAnalParams->peakParams.iMaxPeaks;
+ pSpectralPeaks->nPeaks = pAnalParams->maxPeaks;
pSpectralPeaks->pSpectralPeaks = pAnalParams->ppFrames[iCurrentFrame]->pSpectralPeaks;
+
/* convert peak amps to linear */
for(i = 0; i < pSpectralPeaks->nPeaksFound; i++)
{
- pSpectralPeaks->pSpectralPeaks[i].fMag = sms_dBToMag(pSpectralPeaks->pSpectralPeaks[i].fMag);
+ pSpectralPeaks->pSpectralPeaks[i].fMag = pow(10.0, 0.05*(pSpectralPeaks->pSpectralPeaks[i].fMag));
}
- return pSpectralPeaks->nPeaksFound;
+ return pSpectralPeaks->nPeaks;
}
else
{
diff --git a/sms/fileIO.c b/sms/fileIO.c
index 67d750a..8fbfa5b 100644
--- a/sms/fileIO.c
+++ b/sms/fileIO.c
@@ -35,24 +35,24 @@ static char pChTextString[1000]; /*!< string to store analysis parameters in sms
/*! \brief initialize the header structure of an SMS file
*
- * \param pSmsHeader header for SMS file
+ * \param pSmsHeader header for SMS file
*/
void sms_initHeader (SMS_Header *pSmsHeader)
{
- pSmsHeader->iSmsMagic = SMS_MAGIC;
- pSmsHeader->iHeadBSize = sizeof(SMS_Header);
- pSmsHeader->nFrames = 0;
- pSmsHeader->iFrameBSize = 0;
- pSmsHeader->iFormat = SMS_FORMAT_H;
- pSmsHeader->iFrameRate = 0;
- pSmsHeader->iStochasticType = SMS_STOC_APPROX;
- pSmsHeader->nTracks = 0;
- pSmsHeader->nStochasticCoeff = 0;
- pSmsHeader->nEnvCoeff = 0;
- pSmsHeader->iMaxFreq = 0;
- pSmsHeader->fResidualPerc = 0;
- pSmsHeader->nTextCharacters = 0;
- pSmsHeader->pChTextCharacters = NULL;
+ pSmsHeader->iSmsMagic = SMS_MAGIC;
+ pSmsHeader->iHeadBSize = sizeof(SMS_Header);
+ pSmsHeader->nFrames = 0;
+ pSmsHeader->iFrameBSize = 0;
+ pSmsHeader->iFormat = SMS_FORMAT_H;
+ pSmsHeader->iFrameRate = 0;
+ pSmsHeader->iStochasticType = SMS_STOC_APPROX;
+ pSmsHeader->nTracks = 0;
+ pSmsHeader->nStochasticCoeff = 0;
+ pSmsHeader->nEnvCoeff = 0;
+ pSmsHeader->iMaxFreq = 0;
+ pSmsHeader->fResidualPerc = 0;
+ pSmsHeader->nTextCharacters = 0;
+ pSmsHeader->pChTextCharacters = NULL;
}
/*! \brief fill an SMS header with necessary information for storage
@@ -68,164 +68,164 @@ void sms_initHeader (SMS_Header *pSmsHeader)
* \param pProgramString pointer to a string containing the name of the program that made the analysis data
*/
void sms_fillHeader (SMS_Header *pSmsHeader, SMS_AnalParams *pAnalParams,
- char *pProgramString)
+ char *pProgramString)
{
- sms_initHeader (pSmsHeader);
- pSmsHeader->nFrames = pAnalParams->nFrames;
- pSmsHeader->iFormat = pAnalParams->iFormat;
- pSmsHeader->iFrameRate = pAnalParams->iFrameRate;
- pSmsHeader->iStochasticType = pAnalParams->iStochasticType;
- pSmsHeader->nTracks = pAnalParams->nTracks;
- pSmsHeader->iSamplingRate = pAnalParams->iSamplingRate;
- if(pAnalParams->iStochasticType == SMS_STOC_NONE)
- pSmsHeader->nStochasticCoeff = 0;
- else
- pSmsHeader->nStochasticCoeff = pAnalParams->nStochasticCoeff;
- pSmsHeader->iEnvType = pAnalParams->specEnvParams.iType;
- pSmsHeader->nEnvCoeff = pAnalParams->specEnvParams.nCoeff;
- pSmsHeader->iMaxFreq = (int) pAnalParams->fHighestFreq;
- pSmsHeader->iFrameBSize = sms_frameSizeB(pSmsHeader);
- sprintf (pChTextString,
- "created by %s with parameters: format %d, soundType %d, "
- "analysisDirection %d, windowSize %.2f,"
- " windowType %d, frameRate %d, highestFreq %.2f, minPeakMag %.2f,"
- " refHarmonic %d, minRefHarmMag %.2f, refHarmMagDiffFromMax %.2f,"
- " defaultFund %.2f, lowestFund %.2f, highestFund %.2f, nGuides %d,"
- " nTracks %d, freqDeviation %.2f, peakContToGuide %.2f,"
- " fundContToGuide %.2f, cleanTracks %d, iMinTrackLength %d,"
- "iMaxSleepingTime %d, stochasticType %d, nStocCoeff %d\n"
- "iEnvType: %d, nEnvCoeff: %d",
- pProgramString,
- pAnalParams->iFormat, pAnalParams->iSoundType,
- pAnalParams->iAnalysisDirection, pAnalParams->fSizeWindow,
- pAnalParams->iWindowType, pAnalParams->iFrameRate,
- pAnalParams->fHighestFreq, pAnalParams->fMinPeakMag,
- pAnalParams->iRefHarmonic, pAnalParams->fMinRefHarmMag,
- pAnalParams->fRefHarmMagDiffFromMax,
- pAnalParams->fDefaultFundamental, pAnalParams->fLowestFundamental,
- pAnalParams->fHighestFundamental, pAnalParams->nGuides,
- pAnalParams->nTracks, pAnalParams->fFreqDeviation,
- pAnalParams->fPeakContToGuide, pAnalParams->fFundContToGuide,
- pAnalParams->iCleanTracks, pAnalParams->iMinTrackLength,
- pAnalParams->iMaxSleepingTime, pAnalParams->iStochasticType,
- pAnalParams->nStochasticCoeff, pSmsHeader->iEnvType, pSmsHeader->nEnvCoeff);
-
- pSmsHeader->nTextCharacters = strlen (pChTextString) + 1;
- pSmsHeader->pChTextCharacters = (char *) pChTextString;
+ sms_initHeader (pSmsHeader);
+ pSmsHeader->nFrames = pAnalParams->nFrames;
+ pSmsHeader->iFormat = pAnalParams->iFormat;
+ pSmsHeader->iFrameRate = pAnalParams->iFrameRate;
+ pSmsHeader->iStochasticType = pAnalParams->iStochasticType;
+ pSmsHeader->nTracks = pAnalParams->nTracks;
+ pSmsHeader->iSamplingRate = pAnalParams->iSamplingRate;
+ if(pAnalParams->iStochasticType == SMS_STOC_NONE)
+ pSmsHeader->nStochasticCoeff = 0;
+ else
+ pSmsHeader->nStochasticCoeff = pAnalParams->nStochasticCoeff;
+ pSmsHeader->iEnvType = pAnalParams->specEnvParams.iType;
+ pSmsHeader->nEnvCoeff = pAnalParams->specEnvParams.nCoeff;
+ pSmsHeader->iMaxFreq = (int) pAnalParams->fHighestFreq;
+ pSmsHeader->iFrameBSize = sms_frameSizeB(pSmsHeader);
+ sprintf (pChTextString,
+ "created by %s with parameters: format %d, soundType %d, "
+ "analysisDirection %d, windowSize %.2f,"
+ " windowType %d, frameRate %d, highestFreq %.2f, minPeakMag %.2f,"
+ " refHarmonic %d, minRefHarmMag %.2f, refHarmMagDiffFromMax %.2f,"
+ " defaultFund %.2f, lowestFund %.2f, highestFund %.2f, nGuides %d,"
+ " nTracks %d, freqDeviation %.2f, peakContToGuide %.2f,"
+ " fundContToGuide %.2f, cleanTracks %d, iMinTrackLength %d,"
+ "iMaxSleepingTime %d, stochasticType %d, nStocCoeff %d\n"
+ "iEnvType: %d, nEnvCoeff: %d",
+ pProgramString,
+ pAnalParams->iFormat, pAnalParams->iSoundType,
+ pAnalParams->iAnalysisDirection, pAnalParams->fSizeWindow,
+ pAnalParams->iWindowType, pAnalParams->iFrameRate,
+ pAnalParams->fHighestFreq, pAnalParams->fMinPeakMag,
+ pAnalParams->iRefHarmonic, pAnalParams->fMinRefHarmMag,
+ pAnalParams->fRefHarmMagDiffFromMax,
+ pAnalParams->fDefaultFundamental, pAnalParams->fLowestFundamental,
+ pAnalParams->fHighestFundamental, pAnalParams->nGuides,
+ pAnalParams->nTracks, pAnalParams->fFreqDeviation,
+ pAnalParams->fPeakContToGuide, pAnalParams->fFundContToGuide,
+ pAnalParams->iCleanTracks, pAnalParams->iMinTrackLength,
+ pAnalParams->iMaxSleepingTime, pAnalParams->iStochasticType,
+ pAnalParams->nStochasticCoeff, pSmsHeader->iEnvType, pSmsHeader->nEnvCoeff);
+
+ pSmsHeader->nTextCharacters = strlen (pChTextString) + 1;
+ pSmsHeader->pChTextCharacters = (char *) pChTextString;
}
/*! \brief write SMS header to file
*
- * \param pChFileName file name for SMS file
+ * \param pChFileName file name for SMS file
* \param pSmsHeader header for SMS file
* \param ppSmsFile (double pointer to) file to be created
* \return error code \see SMS_WRERR in SMS_ERRORS
*/
int sms_writeHeader (char *pChFileName, SMS_Header *pSmsHeader,
- FILE **ppSmsFile)
+ FILE **ppSmsFile)
{
- int iVariableSize = 0;
-
- if (pSmsHeader->iSmsMagic != SMS_MAGIC)
- {
- sms_error("not an SMS file");
- return(-1);
- }
- if ((*ppSmsFile = fopen (pChFileName, "w+")) == NULL)
- {
- sms_error("cannot open file for writing");
- return(-1);
- }
- /* check variable size of header */
-/* iVariableSize = sizeof (int) * pSmsHeader->nLoopRecords + */
-/* sizeof (sfloat) * pSmsHeader->nSpecEnvelopePoints + */
-/* sizeof(char) * pSmsHeader->nTextCharacters; */
- iVariableSize = sizeof(char) * pSmsHeader->nTextCharacters;
-
- pSmsHeader->iHeadBSize = sizeof(SMS_Header) + iVariableSize;
-
- /* write header */
- if (fwrite((void *)pSmsHeader, (size_t)1, (size_t)sizeof(SMS_Header),
- *ppSmsFile) < (size_t)sizeof(SMS_Header))
+ int iVariableSize = 0;
+
+ if (pSmsHeader->iSmsMagic != SMS_MAGIC)
+ {
+ sms_error("not an SMS file");
+ return(-1);
+ }
+ if ((*ppSmsFile = fopen (pChFileName, "w+")) == NULL)
+ {
+ sms_error("cannot open file for writing");
+ return(-1);
+ }
+ /* check variable size of header */
+ /* iVariableSize = sizeof (int) * pSmsHeader->nLoopRecords + */
+ /* sizeof (sfloat) * pSmsHeader->nSpecEnvelopePoints + */
+ /* sizeof(char) * pSmsHeader->nTextCharacters; */
+ iVariableSize = sizeof(char) * pSmsHeader->nTextCharacters;
+
+ pSmsHeader->iHeadBSize = sizeof(SMS_Header) + iVariableSize;
+
+ /* write header */
+ if (fwrite((void *)pSmsHeader, (size_t)1, (size_t)sizeof(SMS_Header),
+ *ppSmsFile) < (size_t)sizeof(SMS_Header))
+ {
+ sms_error("cannot write output file");
+ return(-1);
+ }
+ /* write variable part of header */
+ if (pSmsHeader->nTextCharacters > 0)
+ {
+ char *pChStart = (char *) pSmsHeader->pChTextCharacters;
+ int iSize = sizeof(char) * pSmsHeader->nTextCharacters;
+
+ if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, *ppSmsFile) <
+ (size_t)iSize)
{
- sms_error("cannot write output file");
- return(-1);
- }
- /* write variable part of header */
- if (pSmsHeader->nTextCharacters > 0)
- {
- char *pChStart = (char *) pSmsHeader->pChTextCharacters;
- int iSize = sizeof(char) * pSmsHeader->nTextCharacters;
-
- if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, *ppSmsFile) <
- (size_t)iSize)
- {
- sms_error("cannot write output file (nTextCharacters)");
- return(-1);
- }
- }
- return (0);
+ sms_error("cannot write output file (nTextCharacters)");
+ return(-1);
+ }
+ }
+ return (0);
}
/*! \brief rewrite SMS header and close file
*
- * \param pSmsFile pointer to SMS file
+ * \param pSmsFile pointer to SMS file
* \param pSmsHeader pointer to header for SMS file
* \return error code \see SMS_WRERR in SMS_ERRORS
*/
int sms_writeFile (FILE *pSmsFile, SMS_Header *pSmsHeader)
{
- int iVariableSize;
+ int iVariableSize;
+
+ rewind(pSmsFile);
+
+ /* check variable size of header */
+ iVariableSize = sizeof(char) * pSmsHeader->nTextCharacters;
- rewind(pSmsFile);
+ pSmsHeader->iHeadBSize = sizeof(SMS_Header) + iVariableSize;
- /* check variable size of header */
- iVariableSize = sizeof(char) * pSmsHeader->nTextCharacters;
+ /* write header */
+ if (fwrite((void *)pSmsHeader, (size_t)1, (size_t)sizeof(SMS_Header),
+ pSmsFile) < (size_t)sizeof(SMS_Header))
+ {
+ sms_error("cannot write output file (header)");
+ return(-1);
+ }
- pSmsHeader->iHeadBSize = sizeof(SMS_Header) + iVariableSize;
+ if (pSmsHeader->nTextCharacters > 0)
+ {
+ char *pChStart = (char *) pSmsHeader->pChTextCharacters;
+ int iSize = sizeof(char) * pSmsHeader->nTextCharacters;
- /* write header */
- if (fwrite((void *)pSmsHeader, (size_t)1, (size_t)sizeof(SMS_Header),
- pSmsFile) < (size_t)sizeof(SMS_Header))
+ if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pSmsFile) <
+ (size_t)iSize)
{
- sms_error("cannot write output file (header)");
- return(-1);
- }
-
- if (pSmsHeader->nTextCharacters > 0)
- {
- char *pChStart = (char *) pSmsHeader->pChTextCharacters;
- int iSize = sizeof(char) * pSmsHeader->nTextCharacters;
-
- if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pSmsFile) <
- (size_t)iSize)
- {
- sms_error("cannot write output file (nTextCharacters)");
- return(-1);
- }
- }
-
- fclose(pSmsFile);
- return (0);
+ sms_error("cannot write output file (nTextCharacters)");
+ return(-1);
+ }
+ }
+
+ fclose(pSmsFile);
+ return (0);
}
/*! \brief write SMS frame
*
- * \param pSmsFile pointer to SMS file
+ * \param pSmsFile pointer to SMS file
* \param pSmsHeader pointer to SMS header
* \param pSmsFrame pointer to SMS data frame
* \return 0 on success, -1 on failure
*/
int sms_writeFrame (FILE *pSmsFile, SMS_Header *pSmsHeader,
- SMS_Data *pSmsFrame)
+ SMS_Data *pSmsFrame)
{
- if (fwrite ((void *)pSmsFrame->pSmsData, 1, pSmsHeader->iFrameBSize,
- pSmsFile) < (unsigned int) pSmsHeader->iFrameBSize)
- {
- sms_error("cannot write frame to output file");
- return(-1);
- }
- else return (0);
+ if (fwrite ((void *)pSmsFrame->pSmsData, 1, pSmsHeader->iFrameBSize,
+ pSmsFile) < (unsigned int) pSmsHeader->iFrameBSize)
+ {
+ sms_error("cannot write frame to output file");
+ return(-1);
+ }
+ else return (0);
}
@@ -236,251 +236,251 @@ int sms_writeFrame (FILE *pSmsFile, SMS_Header *pSmsHeader,
*/
int sms_frameSizeB (SMS_Header *pSmsHeader)
{
- int iSize, nDet;
-
- if (pSmsHeader->iFormat == SMS_FORMAT_H ||
- pSmsHeader->iFormat == SMS_FORMAT_IH)
- nDet = 2;/* freq, mag */
- else nDet = 3; /* freq, mag, phase */
-
- iSize = sizeof (sfloat) * (nDet * pSmsHeader->nTracks);
-
- if(pSmsHeader->iStochasticType == SMS_STOC_APPROX)
- { /* stocCoeff + 1 (gain) */
- iSize += sizeof(sfloat) * (pSmsHeader->nStochasticCoeff + 1);
- }
- else if(pSmsHeader->iStochasticType == SMS_STOC_IFFT)
- {
- /* sizeFFT*2 + 1 (gain) */
- iSize += sizeof(sfloat) * (pSmsHeader->nStochasticCoeff * 2 + 1);
- }
- iSize += sizeof(sfloat) * pSmsHeader->nEnvCoeff;
- return(iSize);
-}
-
+ int iSize, nDet;
+
+ if (pSmsHeader->iFormat == SMS_FORMAT_H ||
+ pSmsHeader->iFormat == SMS_FORMAT_IH)
+ nDet = 2;/* freq, mag */
+ else nDet = 3; /* freq, mag, phase */
+
+ iSize = sizeof (sfloat) * (nDet * pSmsHeader->nTracks);
+
+ if(pSmsHeader->iStochasticType == SMS_STOC_APPROX)
+ { /* stocCoeff + 1 (gain) */
+ iSize += sizeof(sfloat) * (pSmsHeader->nStochasticCoeff + 1);
+ }
+ else if(pSmsHeader->iStochasticType == SMS_STOC_IFFT)
+ {
+ /* sizeFFT*2 + 1 (gain) */
+ iSize += sizeof(sfloat) * (pSmsHeader->nStochasticCoeff * 2 + 1);
+ }
+ iSize += sizeof(sfloat) * pSmsHeader->nEnvCoeff;
+ return(iSize);
+}
+
/*! \brief function to read SMS header
*
- * \param pChFileName file name for SMS file
- * \param ppSmsHeader (double pointer to) SMS header
+ * \param pChFileName file name for SMS file
+ * \param ppSmsHeader (double pointer to) SMS header
* \param ppSmsFile (double pointer to) inputfile
* \return error code \see SMS_ERRORS
*/
int sms_getHeader (char *pChFileName, SMS_Header **ppSmsHeader,
- FILE **ppSmsFile)
+ FILE **ppSmsFile)
{
- int iHeadBSize, iFrameBSize, nFrames;
- int iMagicNumber;
-
- /* open file for reading */
- if ((*ppSmsFile = fopen (pChFileName, "r")) == NULL)
- {
- sms_error("could not open SMS header");
- return (-1);
- }
- /* read magic number */
- if (fread ((void *) &iMagicNumber, (size_t) sizeof(int), (size_t)1,
- *ppSmsFile) < (size_t)1)
- {
- sms_error("could not read SMS header");
- return (-1);
- }
-
- if (iMagicNumber != SMS_MAGIC)
- {
- sms_error("not an SMS file");
- return (-1);
- }
-
- /* read size of of header */
- if (fread ((void *) &iHeadBSize, (size_t) sizeof(int), (size_t)1,
- *ppSmsFile) < (size_t)1)
- {
- sms_error("could not read SMS header (iHeadBSize)");
- return (-1);
- }
-
- if (iHeadBSize <= 0)
- {
- sms_error("bad SMS header size");
- return (-1);
- }
-
- /* read number of data Frames */
- if (fread ((void *) &nFrames, (size_t) sizeof(int), (size_t)1,
- *ppSmsFile) < (size_t)1)
- {
- sms_error("could not read SMS number of frames");
- return (-1);
- }
-
- if (nFrames <= 0)
- {
- sms_error("number of frames <= 0");
- return (-1);
- }
-
- /* read size of data Frames */
- if (fread ((void *) &iFrameBSize, (size_t) sizeof(int), (size_t)1,
- *ppSmsFile) < (size_t)1)
- {
- sms_error("could not read size of SMS data");
- return (-1);
- }
-
- if (iFrameBSize <= 0)
- {
- sms_error("size bytes of frames <= 0");
- return (-1);
- }
-
- /* allocate memory for header */
- if (((*ppSmsHeader) = (SMS_Header *)malloc (iHeadBSize)) == NULL)
- {
- sms_error("cannot allocate memory for header");
- return (-1);
- }
-
- /* read header */
- rewind (*ppSmsFile);
- if (fread ((void *) (*ppSmsHeader), 1, iHeadBSize, *ppSmsFile) < (unsigned int) iHeadBSize)
- {
- sms_error("cannot read header of SMS file");
- return (-1);
- }
-
- /* set pointers to variable part of header */
-/* if ((*ppSmsHeader)->nLoopRecords > 0) */
-/* (*ppSmsHeader)->pILoopRecords = (int *) ((char *)(*ppSmsHeader) + */
-/* sizeof(SMS_Header)); */
-
-/* if ((*ppSmsHeader)->nSpecEnvelopePoints > 0) */
-/* (*ppSmsHeader)->pFSpectralEnvelope = */
-/* (sfloat *) ((char *)(*ppSmsHeader) + sizeof(SMS_Header) + */
-/* sizeof(int) * (*ppSmsHeader)->nLoopRecords); */
-
-/* if ((*ppSmsHeader)->nTextCharacters > 0) */
-/* (*ppSmsHeader)->pChTextCharacters = */
-/* (char *) ((char *)(*ppSmsHeader) + sizeof(SMS_Header) + */
-/* sizeof(int) * (*ppSmsHeader)->nLoopRecords + */
-/* sizeof(sfloat) * (*ppSmsHeader)->nSpecEnvelopePoints); */
- if ((*ppSmsHeader)->nTextCharacters > 0)
- (*ppSmsHeader)->pChTextCharacters = (char *)(*ppSmsHeader) + sizeof(SMS_Header);
-
- return (0);
+ int iHeadBSize, iFrameBSize, nFrames;
+ int iMagicNumber;
+
+ /* open file for reading */
+ if ((*ppSmsFile = fopen (pChFileName, "r")) == NULL)
+ {
+ sms_error("could not open SMS header");
+ return (-1);
+ }
+ /* read magic number */
+ if (fread ((void *) &iMagicNumber, (size_t) sizeof(int), (size_t)1,
+ *ppSmsFile) < (size_t)1)
+ {
+ sms_error("could not read SMS header");
+ return (-1);
+ }
+
+ if (iMagicNumber != SMS_MAGIC)
+ {
+ sms_error("not an SMS file");
+ return (-1);
+ }
+
+ /* read size of of header */
+ if (fread ((void *) &iHeadBSize, (size_t) sizeof(int), (size_t)1,
+ *ppSmsFile) < (size_t)1)
+ {
+ sms_error("could not read SMS header (iHeadBSize)");
+ return (-1);
+ }
+
+ if (iHeadBSize <= 0)
+ {
+ sms_error("bad SMS header size");
+ return (-1);
+ }
+
+ /* read number of data Frames */
+ if (fread ((void *) &nFrames, (size_t) sizeof(int), (size_t)1,
+ *ppSmsFile) < (size_t)1)
+ {
+ sms_error("could not read SMS number of frames");
+ return (-1);
+ }
+
+ if (nFrames <= 0)
+ {
+ sms_error("number of frames <= 0");
+ return (-1);
+ }
+
+ /* read size of data Frames */
+ if (fread ((void *) &iFrameBSize, (size_t) sizeof(int), (size_t)1,
+ *ppSmsFile) < (size_t)1)
+ {
+ sms_error("could not read size of SMS data");
+ return (-1);
+ }
+
+ if (iFrameBSize <= 0)
+ {
+ sms_error("size bytes of frames <= 0");
+ return (-1);
+ }
+
+ /* allocate memory for header */
+ if (((*ppSmsHeader) = (SMS_Header *)malloc (iHeadBSize)) == NULL)
+ {
+ sms_error("cannot allocate memory for header");
+ return (-1);
+ }
+
+ /* read header */
+ rewind (*ppSmsFile);
+ if (fread ((void *) (*ppSmsHeader), 1, iHeadBSize, *ppSmsFile) < (unsigned int) iHeadBSize)
+ {
+ sms_error("cannot read header of SMS file");
+ return (-1);
+ }
+
+ /* set pointers to variable part of header */
+ /* if ((*ppSmsHeader)->nLoopRecords > 0) */
+ /* (*ppSmsHeader)->pILoopRecords = (int *) ((char *)(*ppSmsHeader) + */
+ /* sizeof(SMS_Header)); */
+
+ /* if ((*ppSmsHeader)->nSpecEnvelopePoints > 0) */
+ /* (*ppSmsHeader)->pFSpectralEnvelope = */
+ /* (sfloat *) ((char *)(*ppSmsHeader) + sizeof(SMS_Header) + */
+ /* sizeof(int) * (*ppSmsHeader)->nLoopRecords); */
+
+ /* if ((*ppSmsHeader)->nTextCharacters > 0) */
+ /* (*ppSmsHeader)->pChTextCharacters = */
+ /* (char *) ((char *)(*ppSmsHeader) + sizeof(SMS_Header) + */
+ /* sizeof(int) * (*ppSmsHeader)->nLoopRecords + */
+ /* sizeof(sfloat) * (*ppSmsHeader)->nSpecEnvelopePoints); */
+ if ((*ppSmsHeader)->nTextCharacters > 0)
+ (*ppSmsHeader)->pChTextCharacters = (char *)(*ppSmsHeader) + sizeof(SMS_Header);
+
+ return (0);
}
/*! \brief read an SMS data frame
*
- * \param pSmsFile pointer to SMS file
- * \param pSmsHeader pointer to SMS header
+ * \param pSmsFile pointer to SMS file
+ * \param pSmsHeader pointer to SMS header
* \param iFrame frame number
* \param pSmsFrame pointer to SMS frame
* \return 0 on sucess, -1 on error
*/
int sms_getFrame (FILE *pSmsFile, SMS_Header *pSmsHeader, int iFrame,
- SMS_Data *pSmsFrame)
+ SMS_Data *pSmsFrame)
{
- if (fseek (pSmsFile, pSmsHeader->iHeadBSize + iFrame *
- pSmsHeader->iFrameBSize, SEEK_SET) < 0)
- {
- sms_error ("cannot seek to the SMS frame");
- return (-1);
- }
- if ((pSmsHeader->iFrameBSize =
- fread ((void *)pSmsFrame->pSmsData, (size_t)1,
- (size_t)pSmsHeader->iFrameBSize, pSmsFile))
- != pSmsHeader->iFrameBSize)
- {
- sms_error ("cannot read SMS frame");
- return (-1);
- }
- return (0);
+ if (fseek (pSmsFile, pSmsHeader->iHeadBSize + iFrame *
+ pSmsHeader->iFrameBSize, SEEK_SET) < 0)
+ {
+ sms_error ("cannot seek to the SMS frame");
+ return (-1);
+ }
+ if ((pSmsHeader->iFrameBSize =
+ fread ((void *)pSmsFrame->pSmsData, (size_t)1,
+ (size_t)pSmsHeader->iFrameBSize, pSmsFile))
+ != pSmsHeader->iFrameBSize)
+ {
+ sms_error ("cannot read SMS frame");
+ return (-1);
+ }
+ return (0);
}
/*! \brief allocate memory for a frame of SMS data
*
- * \param pSmsFrame pointer to a frame of SMS data
- * \param nTracks number of sinusoidal tracks in frame
- * \param nStochCoeff number of stochastic coefficients in frame
- * \param iPhase whether phase information is in the frame
+ * \param pSmsFrame pointer to a frame of SMS data
+ * \param nTracks number of sinusoidal tracks in frame
+ * \param nStochCoeff number of stochastic coefficients in frame
+ * \param iPhase whether phase information is in the frame
* \param stochType stochastic resynthesis type
- * \param nStochCoeff number of envelope coefficients in frame
- * \param nEnvCoeff number of envelope coefficients in frame
+ * \param nStochCoeff number of envelope coefficients in frame
+ * \param nEnvCoeff number of envelope coefficients in frame
* \return 0 on success, -1 on error
*/
int sms_allocFrame (SMS_Data *pSmsFrame, int nTracks, int nStochCoeff, int iPhase,
- int stochType, int nEnvCoeff)
+ int stochType, int nEnvCoeff)
{
- sfloat *dataPos; /* a marker to locate specific data witin smsData */
- /* calculate size of frame */
- int sizeData = 2 * nTracks * sizeof(sfloat);
- sizeData += 1 * sizeof(sfloat); //adding one for nSamples
- if (iPhase > 0) sizeData += nTracks * sizeof(sfloat);
- if (stochType == SMS_STOC_APPROX)
- sizeData += (nStochCoeff + 1) * sizeof(sfloat);
- else if (stochType == SMS_STOC_IFFT)
- sizeData += (2*nStochCoeff + 1) * sizeof(sfloat);
- sizeData += nEnvCoeff * sizeof(sfloat); /* add in number of envelope coefficients (cep or fbins) if any */
- /* allocate memory for data */
- if ((pSmsFrame->pSmsData = (sfloat *) malloc (sizeData)) == NULL)
- {
- sms_error("cannot allocate memory for SMS frame data");
- return (-1);
- }
-
- /* set the variables in the structure */
- /* \todo why not set these in init functions, then allocate with them?? */
- pSmsFrame->sizeData = sizeData;
- pSmsFrame->nTracks = nTracks;
- pSmsFrame->nCoeff = nStochCoeff;
- pSmsFrame->nEnvCoeff = nEnvCoeff;
- /* set pointers to data types within smsData array */
- pSmsFrame->pFSinFreq = pSmsFrame->pSmsData;
- dataPos = (sfloat *)(pSmsFrame->pFSinFreq + nTracks);
- memset(pSmsFrame->pFSinFreq, 0, sizeof(sfloat) * nTracks);
-
- pSmsFrame->pFSinAmp = dataPos;
- dataPos = (sfloat *)(pSmsFrame->pFSinAmp + nTracks);
- memset(pSmsFrame->pFSinAmp, 0, sizeof(sfloat) * nTracks);
-
- if (iPhase > 0)
- {
- pSmsFrame->pFSinPha = dataPos;
- dataPos = (sfloat *) (pSmsFrame->pFSinPha + nTracks);
- memset(pSmsFrame->pFSinPha, 0, sizeof(sfloat) * nTracks);
- }
- else pSmsFrame->pFSinPha = NULL;
-
- if (stochType == SMS_STOC_APPROX)
- {
- pSmsFrame->pFStocCoeff = dataPos;
- dataPos = (sfloat *) (pSmsFrame->pFStocCoeff + nStochCoeff);
- memset(pSmsFrame->pFStocCoeff, 0, sizeof(sfloat) * nStochCoeff);
-
- pSmsFrame->pFStocGain = dataPos;
- dataPos = (sfloat *) (pSmsFrame->pFStocGain + 1);
- }
- else if (stochType == SMS_STOC_IFFT)
- {
- pSmsFrame->pFStocCoeff = dataPos;
- dataPos = (sfloat *) (pSmsFrame->pFStocCoeff + nStochCoeff);
- pSmsFrame->pResPhase = dataPos;
- dataPos = (sfloat *) (pSmsFrame->pResPhase + nStochCoeff);
- pSmsFrame->pFStocGain = dataPos;
- dataPos = (sfloat *) (pSmsFrame->pFStocGain + 1);
- }
- else
- {
- pSmsFrame->pFStocCoeff = NULL;
- pSmsFrame->pResPhase = NULL;
- pSmsFrame->pFStocGain = NULL;
- }
- if (nEnvCoeff > 0)
- pSmsFrame->pSpecEnv = dataPos;
- else
- pSmsFrame->pSpecEnv = NULL;
- return (0);
+ sfloat *dataPos; /* a marker to locate specific data witin smsData */
+ /* calculate size of frame */
+ int sizeData = 2 * nTracks * sizeof(sfloat);
+ sizeData += 1 * sizeof(sfloat); //adding one for nSamples
+ if (iPhase > 0) sizeData += nTracks * sizeof(sfloat);
+ if (stochType == SMS_STOC_APPROX)
+ sizeData += (nStochCoeff + 1) * sizeof(sfloat);
+ else if (stochType == SMS_STOC_IFFT)
+ sizeData += (2*nStochCoeff + 1) * sizeof(sfloat);
+ sizeData += nEnvCoeff * sizeof(sfloat); /* add in number of envelope coefficients (cep or fbins) if any */
+ /* allocate memory for data */
+ if ((pSmsFrame->pSmsData = (sfloat *) malloc (sizeData)) == NULL)
+ {
+ sms_error("cannot allocate memory for SMS frame data");
+ return (-1);
+ }
+
+ /* set the variables in the structure */
+ /* \todo why not set these in init functions, then allocate with them?? */
+ pSmsFrame->sizeData = sizeData;
+ pSmsFrame->nTracks = nTracks;
+ pSmsFrame->nCoeff = nStochCoeff;
+ pSmsFrame->nEnvCoeff = nEnvCoeff;
+ /* set pointers to data types within smsData array */
+ pSmsFrame->pFSinFreq = pSmsFrame->pSmsData;
+ dataPos = (sfloat *)(pSmsFrame->pFSinFreq + nTracks);
+ memset(pSmsFrame->pFSinFreq, 0, sizeof(sfloat) * nTracks);
+
+ pSmsFrame->pFSinAmp = dataPos;
+ dataPos = (sfloat *)(pSmsFrame->pFSinAmp + nTracks);
+ memset(pSmsFrame->pFSinAmp, 0, sizeof(sfloat) * nTracks);
+
+ if (iPhase > 0)
+ {
+ pSmsFrame->pFSinPha = dataPos;
+ dataPos = (sfloat *) (pSmsFrame->pFSinPha + nTracks);
+ memset(pSmsFrame->pFSinPha, 0, sizeof(sfloat) * nTracks);
+ }
+ else pSmsFrame->pFSinPha = NULL;
+
+ if (stochType == SMS_STOC_APPROX)
+ {
+ pSmsFrame->pFStocCoeff = dataPos;
+ dataPos = (sfloat *) (pSmsFrame->pFStocCoeff + nStochCoeff);
+ memset(pSmsFrame->pFStocCoeff, 0, sizeof(sfloat) * nStochCoeff);
+
+ pSmsFrame->pFStocGain = dataPos;
+ dataPos = (sfloat *) (pSmsFrame->pFStocGain + 1);
+ }
+ else if (stochType == SMS_STOC_IFFT)
+ {
+ pSmsFrame->pFStocCoeff = dataPos;
+ dataPos = (sfloat *) (pSmsFrame->pFStocCoeff + nStochCoeff);
+ pSmsFrame->pResPhase = dataPos;
+ dataPos = (sfloat *) (pSmsFrame->pResPhase + nStochCoeff);
+ pSmsFrame->pFStocGain = dataPos;
+ dataPos = (sfloat *) (pSmsFrame->pFStocGain + 1);
+ }
+ else
+ {
+ pSmsFrame->pFStocCoeff = NULL;
+ pSmsFrame->pResPhase = NULL;
+ pSmsFrame->pFStocGain = NULL;
+ }
+ if (nEnvCoeff > 0)
+ pSmsFrame->pSpecEnv = dataPos;
+ else
+ pSmsFrame->pSpecEnv = NULL;
+ return (0);
}
/*! \brief function to allocate an SMS data frame using an SMS_Header
@@ -488,96 +488,96 @@ int sms_allocFrame (SMS_Data *pSmsFrame, int nTracks, int nStochCoeff, int iPhas
* this one is used when you have only read the header, such as after
* opening a file.
*
- * \param pSmsHeader pointer to SMS header
+ * \param pSmsHeader pointer to SMS header
* \param pSmsFrame pointer to SMS frame
* \return 0 on success, -1 on error
*/
int sms_allocFrameH (SMS_Header *pSmsHeader, SMS_Data *pSmsFrame)
{
- int iPhase = (pSmsHeader->iFormat == SMS_FORMAT_HP ||
- pSmsHeader->iFormat == SMS_FORMAT_IHP) ? 1 : 0;
- return (sms_allocFrame (pSmsFrame, pSmsHeader->nTracks,
- pSmsHeader->nStochasticCoeff, iPhase,
- pSmsHeader->iStochasticType, pSmsHeader->nEnvCoeff));
+ int iPhase = (pSmsHeader->iFormat == SMS_FORMAT_HP ||
+ pSmsHeader->iFormat == SMS_FORMAT_IHP) ? 1 : 0;
+ return (sms_allocFrame (pSmsFrame, pSmsHeader->nTracks,
+ pSmsHeader->nStochasticCoeff, iPhase,
+ pSmsHeader->iStochasticType, pSmsHeader->nEnvCoeff));
}
/*! \brief free the SMS data structure
*
- * \param pSmsFrame pointer to frame of SMS data
+ * \param pSmsFrame pointer to frame of SMS data
*/
void sms_freeFrame (SMS_Data *pSmsFrame)
{
- free(pSmsFrame->pSmsData);
- pSmsFrame->nTracks = 0;
- pSmsFrame->nCoeff = 0;
- pSmsFrame->sizeData = 0;
- pSmsFrame->pFSinFreq = NULL;
- pSmsFrame->pFSinAmp = NULL;
- pSmsFrame->pFStocCoeff = NULL;
- pSmsFrame->pResPhase = NULL;
- pSmsFrame->pFStocGain = NULL;
+ free(pSmsFrame->pSmsData);
+ pSmsFrame->nTracks = 0;
+ pSmsFrame->nCoeff = 0;
+ pSmsFrame->sizeData = 0;
+ pSmsFrame->pFSinFreq = NULL;
+ pSmsFrame->pFSinAmp = NULL;
+ pSmsFrame->pFStocCoeff = NULL;
+ pSmsFrame->pResPhase = NULL;
+ pSmsFrame->pFStocGain = NULL;
}
/*! \brief clear the SMS data structure
*
- * \param pSmsFrame pointer to frame of SMS data
+ * \param pSmsFrame pointer to frame of SMS data
*/
void sms_clearFrame (SMS_Data *pSmsFrame)
{
- memset ((char *) pSmsFrame->pSmsData, 0, pSmsFrame->sizeData);
+ memset ((char *) pSmsFrame->pSmsData, 0, pSmsFrame->sizeData);
}
-
+
/*! \brief copy a frame of SMS_Data
*
- * \param pCopySmsData copy of frame
- * \param pOriginalSmsData original frame
+ * \param pCopySmsData copy of frame
+ * \param pOriginalSmsData original frame
*
*/
void sms_copyFrame (SMS_Data *pCopySmsData, SMS_Data *pOriginalSmsData)
{
- /* if the two frames are the same size just copy data */
- if (pCopySmsData->sizeData == pOriginalSmsData->sizeData &&
- pCopySmsData->nTracks == pOriginalSmsData->nTracks)
- {
- memcpy ((char *)pCopySmsData->pSmsData,
- (char *)pOriginalSmsData->pSmsData,
- pCopySmsData->sizeData);
- }
- /* if frames is different size copy the smallest */
- else
- {
- int nTracks = MIN (pCopySmsData->nTracks, pOriginalSmsData->nTracks);
- int nCoeff = MIN (pCopySmsData->nCoeff, pOriginalSmsData->nCoeff);
-
- pCopySmsData->nTracks = nTracks;
- pCopySmsData->nCoeff = nCoeff;
- memcpy ((char *)pCopySmsData->pFSinFreq,
- (char *)pOriginalSmsData->pFSinFreq,
- sizeof(sfloat) * nTracks);
- memcpy ((char *)pCopySmsData->pFSinAmp,
- (char *)pOriginalSmsData->pFSinAmp,
- sizeof(sfloat) * nTracks);
- if (pOriginalSmsData->pFSinPha != NULL &&
- pCopySmsData->pFSinPha != NULL)
- memcpy ((char *)pCopySmsData->pFSinPha,
- (char *)pOriginalSmsData->pFSinPha,
- sizeof(sfloat) * nTracks);
- if (pOriginalSmsData->pFStocCoeff != NULL &&
- pCopySmsData->pFStocCoeff != NULL)
- {
- if (pOriginalSmsData->pResPhase != NULL &&
- pCopySmsData->pResPhase != NULL)
- memcpy ((char *)pCopySmsData->pResPhase,
- (char *)pOriginalSmsData->pResPhase,
- sizeof(sfloat) * nCoeff);
- }
- if (pOriginalSmsData->pFStocGain != NULL &&
- pCopySmsData->pFStocGain != NULL)
- memcpy ((char *)pCopySmsData->pFStocGain,
- (char *)pOriginalSmsData->pFStocGain,
- sizeof(sfloat));
- }
+ /* if the two frames are the same size just copy data */
+ if (pCopySmsData->sizeData == pOriginalSmsData->sizeData &&
+ pCopySmsData->nTracks == pOriginalSmsData->nTracks)
+ {
+ memcpy ((char *)pCopySmsData->pSmsData,
+ (char *)pOriginalSmsData->pSmsData,
+ pCopySmsData->sizeData);
+ }
+ /* if frames is different size copy the smallest */
+ else
+ {
+ int nTracks = MIN (pCopySmsData->nTracks, pOriginalSmsData->nTracks);
+ int nCoeff = MIN (pCopySmsData->nCoeff, pOriginalSmsData->nCoeff);
+
+ pCopySmsData->nTracks = nTracks;
+ pCopySmsData->nCoeff = nCoeff;
+ memcpy ((char *)pCopySmsData->pFSinFreq,
+ (char *)pOriginalSmsData->pFSinFreq,
+ sizeof(sfloat) * nTracks);
+ memcpy ((char *)pCopySmsData->pFSinAmp,
+ (char *)pOriginalSmsData->pFSinAmp,
+ sizeof(sfloat) * nTracks);
+ if (pOriginalSmsData->pFSinPha != NULL &&
+ pCopySmsData->pFSinPha != NULL)
+ memcpy ((char *)pCopySmsData->pFSinPha,
+ (char *)pOriginalSmsData->pFSinPha,
+ sizeof(sfloat) * nTracks);
+ if (pOriginalSmsData->pFStocCoeff != NULL &&
+ pCopySmsData->pFStocCoeff != NULL)
+ {
+ if (pOriginalSmsData->pResPhase != NULL &&
+ pCopySmsData->pResPhase != NULL)
+ memcpy ((char *)pCopySmsData->pResPhase,
+ (char *)pOriginalSmsData->pResPhase,
+ sizeof(sfloat) * nCoeff);
+ }
+ if (pOriginalSmsData->pFStocGain != NULL &&
+ pCopySmsData->pFStocGain != NULL)
+ memcpy ((char *)pCopySmsData->pFStocGain,
+ (char *)pOriginalSmsData->pFStocGain,
+ sizeof(sfloat));
+ }
}
/*! \brief function to interpolate two SMS frames
@@ -590,44 +590,44 @@ void sms_copyFrame (SMS_Data *pCopySmsData, SMS_Data *pOriginalSmsData)
* \param fInterpFactor interpolation factor
*/
void sms_interpolateFrames (SMS_Data *pSmsFrame1, SMS_Data *pSmsFrame2,
- SMS_Data *pSmsFrameOut, sfloat fInterpFactor)
+ SMS_Data *pSmsFrameOut, sfloat fInterpFactor)
{
- int i;
- sfloat fFreq1, fFreq2;
-
- /* interpolate the deterministic part */
- for (i = 0; i < pSmsFrame1->nTracks; i++)
- {
- fFreq1 = pSmsFrame1->pFSinFreq[i];
- fFreq2 = pSmsFrame2->pFSinFreq[i];
- if (fFreq1 == 0) fFreq1 = fFreq2;
- if (fFreq2 == 0) fFreq2 = fFreq1;
- pSmsFrameOut->pFSinFreq[i] =
- fFreq1 + fInterpFactor * (fFreq2 - fFreq1);
- pSmsFrameOut->pFSinAmp[i] =
- pSmsFrame1->pFSinAmp[i] + fInterpFactor *
- (pSmsFrame2->pFSinAmp[i] - pSmsFrame1->pFSinAmp[i]);
- }
-
- /* interpolate the stochastic part. The pointer is non-null when the frame contains
- stochastic coefficients */
- if (pSmsFrameOut->pFStocGain)
- {
- *(pSmsFrameOut->pFStocGain) =
- *(pSmsFrame1->pFStocGain) + fInterpFactor *
- (*(pSmsFrame2->pFStocGain) - *(pSmsFrame1->pFStocGain));
- }
- /*! \todo how to interpolate residual phase spectrum */
- for (i = 0; i < pSmsFrame1->nCoeff; i++)
- pSmsFrameOut->pFStocCoeff[i] =
- pSmsFrame1->pFStocCoeff[i] + fInterpFactor *
- (pSmsFrame2->pFStocCoeff[i] - pSmsFrame1->pFStocCoeff[i]);
-
- /* DO NEXT: interpolate spec env here if fbins */
- for (i = 0; i < pSmsFrame1->nEnvCoeff; i++)
- pSmsFrameOut->pSpecEnv[i] =
- pSmsFrame1->pSpecEnv[i] + fInterpFactor *
- (pSmsFrame2->pSpecEnv[i] - pSmsFrame1->pSpecEnv[i]);
-
+ int i;
+ sfloat fFreq1, fFreq2;
+
+ /* interpolate the deterministic part */
+ for (i = 0; i < pSmsFrame1->nTracks; i++)
+ {
+ fFreq1 = pSmsFrame1->pFSinFreq[i];
+ fFreq2 = pSmsFrame2->pFSinFreq[i];
+ if (fFreq1 == 0) fFreq1 = fFreq2;
+ if (fFreq2 == 0) fFreq2 = fFreq1;
+ pSmsFrameOut->pFSinFreq[i] =
+ fFreq1 + fInterpFactor * (fFreq2 - fFreq1);
+ pSmsFrameOut->pFSinAmp[i] =
+ pSmsFrame1->pFSinAmp[i] + fInterpFactor *
+ (pSmsFrame2->pFSinAmp[i] - pSmsFrame1->pFSinAmp[i]);
+ }
+
+ /* interpolate the stochastic part. The pointer is non-null when the frame contains
+ stochastic coefficients */
+ if (pSmsFrameOut->pFStocGain)
+ {
+ *(pSmsFrameOut->pFStocGain) =
+ *(pSmsFrame1->pFStocGain) + fInterpFactor *
+ (*(pSmsFrame2->pFStocGain) - *(pSmsFrame1->pFStocGain));
+ }
+ /*! \todo how to interpolate residual phase spectrum */
+ for (i = 0; i < pSmsFrame1->nCoeff; i++)
+ pSmsFrameOut->pFStocCoeff[i] =
+ pSmsFrame1->pFStocCoeff[i] + fInterpFactor *
+ (pSmsFrame2->pFStocCoeff[i] - pSmsFrame1->pFStocCoeff[i]);
+
+ /* DO NEXT: interpolate spec env here if fbins */
+ for (i = 0; i < pSmsFrame1->nEnvCoeff; i++)
+ pSmsFrameOut->pSpecEnv[i] =
+ pSmsFrame1->pSpecEnv[i] + fInterpFactor *
+ (pSmsFrame2->pSpecEnv[i] - pSmsFrame1->pSpecEnv[i]);
+
}
diff --git a/sms/fixTracks.c b/sms/fixTracks.c
index 7796ead..dc507f8 100644
--- a/sms/fixTracks.c
+++ b/sms/fixTracks.c
@@ -151,7 +151,7 @@ static void DeleteShortTrack (int iCurrentFrame, int iTrack, int *pIState,
* \param iCurrentFrame current frame number
* \param pAnalParams pointer to analysis parameters
*/
-void sms_cleanTracks (int iCurrentFrame, SMS_AnalParams *pAnalParams)
+void sms_cleanTracks(int iCurrentFrame, SMS_AnalParams *pAnalParams)
{
int iTrack, iLength, iFrame;
static int *pIState = NULL;
diff --git a/sms/peakDetection.c b/sms/peakDetection.c
index ad94332..1bbe713 100644
--- a/sms/peakDetection.c
+++ b/sms/peakDetection.c
@@ -38,12 +38,12 @@
static sfloat PeakInterpolation (sfloat fMaxVal, sfloat fLeftBinVal,
sfloat fRightBinVal, sfloat *pFDiffFromMax)
{
- /* get the location of the tip of the parabola */
- *pFDiffFromMax = (.5 * (fLeftBinVal - fRightBinVal) /
- (fLeftBinVal - (2*fMaxVal) + fRightBinVal));
- /* return the value at the tip */
- return(fMaxVal - (.25 * (fLeftBinVal - fRightBinVal) *
- *pFDiffFromMax));
+ /* get the location of the tip of the parabola */
+ *pFDiffFromMax = (.5 * (fLeftBinVal - fRightBinVal) /
+ (fLeftBinVal - (2*fMaxVal) + fRightBinVal));
+ /* return the value at the tip */
+ return(fMaxVal - (.25 * (fLeftBinVal - fRightBinVal) *
+ *pFDiffFromMax));
}
/*! \brief detect the next local maximum in the spectrum
@@ -62,29 +62,29 @@ static sfloat PeakInterpolation (sfloat fMaxVal, sfloat fLeftBinVal,
static int FindNextMax ( sfloat *pFMagSpectrum, int iHighBinBound,
int *pICurrentLoc, sfloat *pFMaxVal, sfloat fMinPeakMag)
{
- int iCurrentBin = *pICurrentLoc;
- sfloat fPrevVal = pFMagSpectrum[iCurrentBin - 1];
+ int iCurrentBin = *pICurrentLoc;
+ sfloat fPrevVal = pFMagSpectrum[iCurrentBin - 1];
sfloat fCurrentVal = pFMagSpectrum[iCurrentBin];
sfloat fNextVal = (iCurrentBin >= iHighBinBound)
? 0 : pFMagSpectrum[iCurrentBin + 1];
- /* try to find a local maximum */
- while (iCurrentBin <= iHighBinBound)
- {
- if (fCurrentVal > fMinPeakMag &&
- fCurrentVal >= fPrevVal &&
- fCurrentVal >= fNextVal)
- break;
- iCurrentBin++;
- fPrevVal = fCurrentVal;
- fCurrentVal = fNextVal;
- fNextVal = pFMagSpectrum[1+iCurrentBin];
- }
- /* save the current location, value of maximum and return */
- /* location of max */
- *pICurrentLoc = iCurrentBin + 1;
- *pFMaxVal = fCurrentVal;
- return(iCurrentBin);
+ /* try to find a local maximum */
+ while (iCurrentBin <= iHighBinBound)
+ {
+ if (fCurrentVal > fMinPeakMag &&
+ fCurrentVal >= fPrevVal &&
+ fCurrentVal >= fNextVal)
+ break;
+ iCurrentBin++;
+ fPrevVal = fCurrentVal;
+ fCurrentVal = fNextVal;
+ fNextVal = pFMagSpectrum[1+iCurrentBin];
+ }
+ /* save the current location, value of maximum and return */
+ /* location of max */
+ *pICurrentLoc = iCurrentBin + 1;
+ *pFMaxVal = fCurrentVal;
+ return(iCurrentBin);
}
/*! \brief function to detect the next spectral peak
@@ -101,29 +101,29 @@ static int FindNextPeak (sfloat *pFMagSpectrum, int iHighestBin,
int *pICurrentLoc, sfloat *pFPeakMag, sfloat *pFPeakLoc,
sfloat fMinPeakMag)
{
- int iPeakBin = 0; /* location of the local peak */
- sfloat fPeakMag = 0; /* value of local peak */
+ int iPeakBin = 0; /* location of the local peak */
+ sfloat fPeakMag = 0; /* value of local peak */
- /* keep trying to find a good peak while inside the freq range */
- while ((iPeakBin = FindNextMax(pFMagSpectrum, iHighestBin,
- pICurrentLoc, &fPeakMag, fMinPeakMag))
- <= iHighestBin)
- {
- /* get the neighboring samples */
- sfloat fDiffFromMax = 0;
- sfloat fLeftBinVal = pFMagSpectrum[iPeakBin - 1];
- sfloat fRightBinVal = pFMagSpectrum[iPeakBin + 1];
- if (fLeftBinVal <= 0 || fRightBinVal <= 0) //ahah! there you are!
- continue;
- /* interpolate the spectral samples to obtain
- a more accurate magnitude and freq */
- *pFPeakMag = PeakInterpolation (fPeakMag, fLeftBinVal,
- fRightBinVal, &fDiffFromMax);
- *pFPeakLoc = iPeakBin + fDiffFromMax;
- return (1);
- }
- /* if it does not find a peak return 0 */
- return (0);
+ /* keep trying to find a good peak while inside the freq range */
+ while ((iPeakBin = FindNextMax(pFMagSpectrum, iHighestBin,
+ pICurrentLoc, &fPeakMag, fMinPeakMag))
+ <= iHighestBin)
+ {
+ /* get the neighboring samples */
+ sfloat fDiffFromMax = 0;
+ sfloat fLeftBinVal = pFMagSpectrum[iPeakBin - 1];
+ sfloat fRightBinVal = pFMagSpectrum[iPeakBin + 1];
+ if (fLeftBinVal <= 0 || fRightBinVal <= 0) //ahah! there you are!
+ continue;
+ /* interpolate the spectral samples to obtain
+ a more accurate magnitude and freq */
+ *pFPeakMag = PeakInterpolation (fPeakMag, fLeftBinVal,
+ fRightBinVal, &fDiffFromMax);
+ *pFPeakLoc = iPeakBin + fDiffFromMax;
+ return (1);
+ }
+ /* if it does not find a peak return 0 */
+ return (0);
}
/*! \brief get the corresponding phase value for a given peak
@@ -136,76 +136,72 @@ static int FindNextPeak (sfloat *pFMagSpectrum, int iHighestBin,
*/
static sfloat GetPhaseVal (sfloat *pPhaseSpectrum, sfloat fPeakLoc)
{
- int bin = (int) fPeakLoc;
- sfloat fFraction = fPeakLoc - bin,
- fLeftPha = pPhaseSpectrum[bin],
- fRightPha = pPhaseSpectrum[bin+1];
+ int bin = (int) fPeakLoc;
+ sfloat fFraction = fPeakLoc - bin,
+ fLeftPha = pPhaseSpectrum[bin],
+ fRightPha = pPhaseSpectrum[bin+1];
- /* check for phase wrapping */
- if (fLeftPha - fRightPha > 1.5 * PI)
- fRightPha += TWO_PI;
- else if (fRightPha - fLeftPha > 1.5 * PI)
- fLeftPha += TWO_PI;
+ /* check for phase wrapping */
+ if (fLeftPha - fRightPha > 1.5 * PI)
+ fRightPha += TWO_PI;
+ else if (fRightPha - fLeftPha > 1.5 * PI)
+ fLeftPha += TWO_PI;
- /* return interpolated phase */
- return (fLeftPha + fFraction * (fRightPha - fLeftPha));
+ /* return interpolated phase */
+ return (fLeftPha + fFraction * (fRightPha - fLeftPha));
}
/*! \brief find the prominent spectral peaks
*
* uses a dB spectrum
*
- * \param sizeSpec size of magnitude spectrum
- * \param pMag pointer to power spectrum
- * \param pPhase pointer to phase spectrum
- * \param pSpectralPeaks pointer to array of peaks
- * \param pPeakParams peak detection parameters
+ * \param sizeSpec size of magnitude spectrum
+ * \param pMag pointer to power spectrum
+ * \param pPhase pointer to phase spectrum
+ * \param pSpectralPeaks pointer to array of peaks
+ * \param pAnalParams peak detection parameters
* \return the number of peaks found
*/
-int sms_detectPeaks (int sizeSpec, sfloat *pMag, sfloat *pPhase,
- SMS_Peak *pSpectralPeaks, SMS_PeakParams *pPeakParams)
+int sms_detectPeaks(int sizeSpec, sfloat *pMag, sfloat *pPhase,
+ SMS_Peak *pSpectralPeaks, SMS_AnalParams *pAnalParams)
{
- static int iFirstBin, iHighestBin, sizeFft;
- static sfloat fInvSizeFft;
- static int sizeSpecStatic = 0;
+ static int iFirstBin, iHighestBin, sizeFft;
+ static sfloat fInvSizeFft;
+ static int sizeSpecStatic = 0;
- /* allocate memory if sizeSpec has changed or this is the first run */
- if(sizeSpecStatic != sizeSpec)
- {
- sizeSpecStatic = sizeSpec;
- //printf("sizeSpecStatic: %d \n", sizeSpecStatic);
- sizeFft = sizeSpec << 1;
- fInvSizeFft = 1.0 / sizeFft;
- /* make sure to start on the 2nd bin so interpolation is possible QUESTION: why not allow a peak in bin 1 or 0? */
- /* rte: changed the first argument of MAX from 2 to 1 */
- iFirstBin = MAX (1, sizeFft * pPeakParams->fLowestFreq /
- pPeakParams->iSamplingRate);
- iHighestBin = MIN (sizeSpec-1,
- sizeFft * pPeakParams->fHighestFreq /
- pPeakParams->iSamplingRate);
- }
+ /* allocate memory if sizeSpec has changed or this is the first run */
+ if(sizeSpecStatic != sizeSpec)
+ {
+ sizeSpecStatic = sizeSpec;
+ sizeFft = sizeSpec << 1;
+ fInvSizeFft = 1.0 / sizeFft;
+ /* make sure to start on the 2nd bin so interpolation is possible QUESTION: why not allow a peak in bin 1 or 0? */
+ /* rte: changed the first argument of MAX from 2 to 1 */
+ iFirstBin = MAX(1, sizeFft * pAnalParams->fLowestFreq / pAnalParams->iSamplingRate);
+ iHighestBin = MIN(sizeSpec-1, sizeFft * pAnalParams->fHighestFreq / pAnalParams->iSamplingRate);
+ }
- /* clear peak structure */
- memset (pSpectralPeaks, 0, pPeakParams->iMaxPeaks * sizeof(SMS_Peak));
+ /* clear peak structure */
+ memset(pSpectralPeaks, 0, pAnalParams->maxPeaks * sizeof(SMS_Peak));
- /* set starting search values */
- int iCurrentLoc = iFirstBin;
- int iPeak = 0; /* index for spectral search */
- sfloat fPeakMag = 0.0; /* magnitude of peak */
- sfloat fPeakLoc = 0.0; /* location of peak */
+ /* set starting search values */
+ int iCurrentLoc = iFirstBin;
+ int iPeak = 0; /* index for spectral search */
+ sfloat fPeakMag = 0.0; /* magnitude of peak */
+ sfloat fPeakLoc = 0.0; /* location of peak */
- /* find peaks */
- while ((iPeak < pPeakParams->iMaxPeaks) &&
- (FindNextPeak(pMag, iHighestBin,
- &iCurrentLoc, &fPeakMag, &fPeakLoc, pPeakParams->fMinPeakMag) == 1))
- {
- /* store peak values */
- pSpectralPeaks[iPeak].fFreq = pPeakParams->iSamplingRate * fPeakLoc * fInvSizeFft;
- pSpectralPeaks[iPeak].fMag = fPeakMag;
- pSpectralPeaks[iPeak].fPhase = GetPhaseVal(pPhase, fPeakLoc);
- iPeak++;
- }
+ /* find peaks */
+ while((iPeak < pAnalParams->maxPeaks) &&
+ (FindNextPeak(pMag, iHighestBin, &iCurrentLoc, &fPeakMag,
+ &fPeakLoc, pAnalParams->fMinPeakMag) == 1))
+ {
+ /* store peak values */
+ pSpectralPeaks[iPeak].fFreq = pAnalParams->iSamplingRate * fPeakLoc * fInvSizeFft;
+ pSpectralPeaks[iPeak].fMag = fPeakMag;
+ pSpectralPeaks[iPeak].fPhase = GetPhaseVal(pPhase, fPeakLoc);
+ iPeak++;
+ }
- /* return the number of peaks found */
- return (iPeak);
+ /* return the number of peaks found */
+ return iPeak;
}
diff --git a/sms/sms.c b/sms/sms.c
index 7401827..6d29e53 100644
--- a/sms/sms.c
+++ b/sms/sms.c
@@ -52,27 +52,27 @@ static int initIsDone = 0; /* \todo is this variable necessary? */
*/
int sms_init( void )
{
- int iError;
- if (!initIsDone)
+ int iError;
+ if (!initIsDone)
+ {
+ initIsDone = 1;
+ if(sms_prepSine (SIZE_TABLES))
{
- initIsDone = 1;
- if(sms_prepSine (SIZE_TABLES))
- {
- sms_error("cannot allocate memory for sine table");
- return (-1);
- }
- if(sms_prepSinc (SIZE_TABLES))
- {
- sms_error("cannot allocate memory for sinc table");
- return (-1);
- }
+ sms_error("cannot allocate memory for sine table");
+ return (-1);
}
+ if(sms_prepSinc (SIZE_TABLES))
+ {
+ sms_error("cannot allocate memory for sinc table");
+ return (-1);
+ }
+ }
#ifdef MERSENNE_TWISTER
- init_gen_rand(1234);
+ init_gen_rand(1234);
#endif
- return (0);
+ return (0);
}
/*! \brief free global data
@@ -81,9 +81,9 @@ int sms_init( void )
*/
void sms_free( void )
{
- initIsDone = 0;
- sms_clearSine();
- sms_clearSinc();
+ initIsDone = 0;
+ sms_clearSine();
+ sms_clearSinc();
}
/*! \brief give default values to an SMS_AnalParams struct
@@ -101,53 +101,55 @@ void sms_free( void )
*/
void sms_initAnalParams(SMS_AnalParams *pAnalParams)
{
- pAnalParams->iDebugMode = 0;
- pAnalParams->iFormat = SMS_FORMAT_H;
- pAnalParams->iSoundType = SMS_SOUND_TYPE_MELODY;
- pAnalParams->iStochasticType =SMS_STOC_APPROX;
- pAnalParams->iFrameRate = 300;
- pAnalParams->nStochasticCoeff = 128;
- pAnalParams->fLowestFundamental = 50;
- pAnalParams->fHighestFundamental = 1000;
- pAnalParams->fDefaultFundamental = 100;
- pAnalParams->fPeakContToGuide = .4;
- pAnalParams->fFundContToGuide = .5;
- pAnalParams->fFreqDeviation = .45;
- pAnalParams->iSamplingRate = 44100; /* should be set to the real samplingrate with sms_initAnalysis */
- pAnalParams->iDefaultSizeWindow = 1001;
- pAnalParams->windowSize = 0;
- pAnalParams->sizeHop = 110;
- pAnalParams->fSizeWindow = 3.5;
- pAnalParams->nTracks = 60;
- pAnalParams->nGuides = 100;
- pAnalParams->iCleanTracks = 1;
- pAnalParams->fMinRefHarmMag = 30;
- pAnalParams->fRefHarmMagDiffFromMax = 30;
- pAnalParams->iRefHarmonic = 1;
- pAnalParams->iMinTrackLength = 40; /*!< depends on iFrameRate normally */
- pAnalParams->iMaxSleepingTime = 40; /*!< depends on iFrameRate normally */
- pAnalParams->fHighestFreq = 12000.;
- pAnalParams->fMinPeakMag = 0.;
- pAnalParams->iAnalysisDirection = SMS_DIR_FWD;
- pAnalParams->iWindowType = SMS_WIN_BH_70;
- pAnalParams->iSizeSound = 0; /*!< no sound yet */
- pAnalParams->nFrames = 0; /*!< no frames yet */
- pAnalParams->minGoodFrames = 3;
- pAnalParams->maxDeviation = 0.01;
- pAnalParams->analDelay = 100;
- pAnalParams->iMaxDelayFrames = MAX(pAnalParams->iMinTrackLength, pAnalParams->iMaxSleepingTime) + 2 +
- (pAnalParams->minGoodFrames + pAnalParams->analDelay);
- pAnalParams->fResidualAccumPerc = 0.;
- pAnalParams->preEmphasisLastValue = 0.;
- pAnalParams->resetGuides = 1;
- pAnalParams->resetGuideStates = 1;
- /* spectral envelope params */
- pAnalParams->specEnvParams.iType = SMS_ENV_NONE; /* turn off enveloping */
- pAnalParams->specEnvParams.iOrder = 25; /* ... but set default params anyway */
- pAnalParams->specEnvParams.fLambda = 0.00001;
- pAnalParams->specEnvParams.iMaxFreq = 0;
- pAnalParams->specEnvParams.nCoeff = 0;
- pAnalParams->specEnvParams.iAnchor = 0; /* not yet implemented */
+ pAnalParams->iDebugMode = 0;
+ pAnalParams->iFormat = SMS_FORMAT_H;
+ pAnalParams->iSoundType = SMS_SOUND_TYPE_MELODY;
+ pAnalParams->iStochasticType =SMS_STOC_APPROX;
+ pAnalParams->iFrameRate = 300;
+ pAnalParams->nStochasticCoeff = 128;
+ pAnalParams->fLowestFundamental = 50;
+ pAnalParams->fHighestFundamental = 1000;
+ pAnalParams->fDefaultFundamental = 100;
+ pAnalParams->fPeakContToGuide = .4;
+ pAnalParams->fFundContToGuide = .5;
+ pAnalParams->fFreqDeviation = .45;
+ pAnalParams->iSamplingRate = 44100; /* should be set to the real samplingrate with sms_initAnalysis */
+ pAnalParams->iDefaultSizeWindow = 1001;
+ pAnalParams->windowSize = 0;
+ pAnalParams->sizeHop = 110;
+ pAnalParams->fSizeWindow = 3.5;
+ pAnalParams->nTracks = 60;
+ pAnalParams->maxPeaks = 60;
+ pAnalParams->nGuides = 100;
+ pAnalParams->iCleanTracks = 1;
+ pAnalParams->fMinRefHarmMag = 30;
+ pAnalParams->fRefHarmMagDiffFromMax = 30;
+ pAnalParams->iRefHarmonic = 1;
+ pAnalParams->iMinTrackLength = 40; /*!< depends on iFrameRate normally */
+ pAnalParams->iMaxSleepingTime = 40; /*!< depends on iFrameRate normally */
+ pAnalParams->fLowestFreq = 50.0;
+ pAnalParams->fHighestFreq = 12000.;
+ pAnalParams->fMinPeakMag = 0.;
+ pAnalParams->iAnalysisDirection = SMS_DIR_FWD;
+ pAnalParams->iWindowType = SMS_WIN_BH_70;
+ pAnalParams->iSizeSound = 0; /*!< no sound yet */
+ pAnalParams->nFrames = 0; /*!< no frames yet */
+ pAnalParams->minGoodFrames = 3;
+ pAnalParams->maxDeviation = 0.01;
+ pAnalParams->analDelay = 100;
+ pAnalParams->iMaxDelayFrames = MAX(pAnalParams->iMinTrackLength, pAnalParams->iMaxSleepingTime) + 2 +
+ (pAnalParams->minGoodFrames + pAnalParams->analDelay);
+ pAnalParams->fResidualAccumPerc = 0.;
+ pAnalParams->preEmphasisLastValue = 0.;
+ pAnalParams->resetGuides = 1;
+ pAnalParams->resetGuideStates = 1;
+ /* spectral envelope params */
+ pAnalParams->specEnvParams.iType = SMS_ENV_NONE; /* turn off enveloping */
+ pAnalParams->specEnvParams.iOrder = 25; /* ... but set default params anyway */
+ pAnalParams->specEnvParams.fLambda = 0.00001;
+ pAnalParams->specEnvParams.iMaxFreq = 0;
+ pAnalParams->specEnvParams.nCoeff = 0;
+ pAnalParams->specEnvParams.iAnchor = 0; /* not yet implemented */
}
/*! \brief initialize analysis data structure's arrays
@@ -162,165 +164,165 @@ void sms_initAnalParams(SMS_AnalParams *pAnalParams)
*/
int sms_initAnalysis(SMS_AnalParams *pAnalParams)
{
- int i;
+ int i;
SMS_SndBuffer *pSynthBuf = &pAnalParams->synthBuffer;
SMS_SndBuffer *pSoundBuf = &pAnalParams->soundBuffer;
/* define the hopsize for each record */
- pAnalParams->sizeHop = (int)(pAnalParams->iSamplingRate /
- (sfloat) pAnalParams->iFrameRate);
+ pAnalParams->sizeHop = (int)(pAnalParams->iSamplingRate /
+ (sfloat) pAnalParams->iFrameRate);
/* define the number of frames and number of samples */
-// pAnalParams->nFrames = pSoundHeader->nSamples / (sfloat) pAnalParams->sizeHop;
-// pAnalParams->iSizeSound = pSoundHeader->nSamples;
+ // pAnalParams->nFrames = pSoundHeader->nSamples / (sfloat) pAnalParams->sizeHop;
+ // pAnalParams->iSizeSound = pSoundHeader->nSamples;
/* set the default size window to an odd length */
- pAnalParams->iDefaultSizeWindow =
- (int)((pAnalParams->iSamplingRate / pAnalParams->fDefaultFundamental) *
- pAnalParams->fSizeWindow / 2) * 2 + 1;
-
- int sizeBuffer = (pAnalParams->iMaxDelayFrames * pAnalParams->sizeHop) + SMS_MAX_WINDOW;
-
- /* if storing residual phases, restrict number of stochastic coefficients to the size of the spectrum (sizeHop = 1/2 sizeFft)*/
- if(pAnalParams->iStochasticType == SMS_STOC_IFFT)
- pAnalParams->nStochasticCoeff = sms_power2(pAnalParams->sizeHop);
-
- /* do the same if spectral envelope is to be stored in frequency bins */
- if(pAnalParams->specEnvParams.iType == SMS_ENV_FBINS)
- pAnalParams->specEnvParams.nCoeff = sms_power2(pAnalParams->specEnvParams.iOrder * 2);
- else if(pAnalParams->specEnvParams.iType == SMS_ENV_CEP)
- pAnalParams->specEnvParams.nCoeff = pAnalParams->specEnvParams.iOrder+1;
- /* if specEnvParams.iMaxFreq is still 0, set it to the same as fHighestFreq (normally what you want)*/
- if(pAnalParams->specEnvParams.iMaxFreq == 0)
- pAnalParams->specEnvParams.iMaxFreq = pAnalParams->fHighestFreq;
-
- /*\todo this probably doesn't need env coefficients - they aren't getting used */
- sms_allocFrame (&pAnalParams->prevFrame, pAnalParams->nGuides,
- pAnalParams->nStochasticCoeff, 1, pAnalParams->iStochasticType, 0);
-
- pAnalParams->sizeNextRead = (pAnalParams->iDefaultSizeWindow + 1) * 0.5; /* \todo REMOVE THIS from other files first */
-
- /* sound buffer */
- if ((pSoundBuf->pFBuffer = (sfloat *) calloc(sizeBuffer, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return(-1);
- }
- pSoundBuf->iMarker = -sizeBuffer;
- pSoundBuf->iFirstGood = sizeBuffer;
- pSoundBuf->sizeBuffer = sizeBuffer;
-
- /* check default fundamental */
- if (pAnalParams->fDefaultFundamental < pAnalParams->fLowestFundamental)
- {
- pAnalParams->fDefaultFundamental = pAnalParams->fLowestFundamental;
- }
- if (pAnalParams->fDefaultFundamental > pAnalParams->fHighestFundamental)
- {
- pAnalParams->fDefaultFundamental = pAnalParams->fHighestFundamental;
- }
-
- /* initialize peak detection/continuation parameters */
- pAnalParams->peakParams.fLowestFreq = pAnalParams->fLowestFundamental;
- pAnalParams->peakParams.fHighestFreq = pAnalParams->fHighestFreq;
- pAnalParams->peakParams.fMinPeakMag = pAnalParams->fMinPeakMag;
- pAnalParams->peakParams.iSamplingRate = pAnalParams->iSamplingRate;
- pAnalParams->peakParams.iMaxPeaks = SMS_MAX_NPEAKS;
- pAnalParams->peakParams.fHighestFundamental = pAnalParams->fHighestFundamental;
- pAnalParams->peakParams.iRefHarmonic = pAnalParams->iRefHarmonic;
- pAnalParams->peakParams.fMinRefHarmMag = pAnalParams->fMinRefHarmMag;
- pAnalParams->peakParams.fRefHarmMagDiffFromMax = pAnalParams->fRefHarmMagDiffFromMax;
- pAnalParams->peakParams.iSoundType = pAnalParams->iSoundType;
-
- /* deterministic synthesis buffer */
- pSynthBuf->sizeBuffer = pAnalParams->sizeHop << 1;
- if((pSynthBuf->pFBuffer = (sfloat *)calloc(pSynthBuf->sizeBuffer, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return(-1);
- }
- pSynthBuf->iMarker = -sizeBuffer;
- pSynthBuf->iMarker = pSynthBuf->sizeBuffer;
-
- /* buffer of analysis frames */
- if ((pAnalParams->pFrames = (SMS_AnalFrame *) calloc(pAnalParams->iMaxDelayFrames, sizeof(SMS_AnalFrame))) == NULL)
- {
- sms_error("could not allocate memory for delay frames");
- return(-1);
- }
- if ((pAnalParams->ppFrames =
- (SMS_AnalFrame **) calloc(pAnalParams->iMaxDelayFrames, sizeof(SMS_AnalFrame *))) == NULL)
- {
- sms_error("could not allocate memory for pointers to delay frames");
- return(-1);
- }
-
- /* initialize the frame pointers and allocate memory */
- for (i = 0; i < pAnalParams->iMaxDelayFrames; i++)
- {
- pAnalParams->pFrames[i].iStatus = SMS_FRAME_EMPTY;
- if (((pAnalParams->pFrames[i]).pSpectralPeaks =
- (SMS_Peak *)calloc (pAnalParams->peakParams.iMaxPeaks, sizeof(SMS_Peak))) == NULL)
- {
- sms_error("could not allocate memory for spectral peaks");
- return(-1);
- }
- (pAnalParams->pFrames[i].deterministic).nTracks = pAnalParams->nGuides;
- if (((pAnalParams->pFrames[i].deterministic).pFSinFreq =
- (sfloat *)calloc (pAnalParams->nGuides, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return(-1);
- }
- if (((pAnalParams->pFrames[i].deterministic).pFSinAmp =
- (sfloat *)calloc (pAnalParams->nGuides, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return(-1);
- }
- if (((pAnalParams->pFrames[i].deterministic).pFSinPha =
- (sfloat *) calloc (pAnalParams->nGuides, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return(-1);
- }
- pAnalParams->ppFrames[i] = &pAnalParams->pFrames[i];
- }
-
- return (0);
+ pAnalParams->iDefaultSizeWindow =
+ (int)((pAnalParams->iSamplingRate / pAnalParams->fDefaultFundamental) *
+ pAnalParams->fSizeWindow / 2) * 2 + 1;
+
+ int sizeBuffer = (pAnalParams->iMaxDelayFrames * pAnalParams->sizeHop) + SMS_MAX_WINDOW;
+
+ /* if storing residual phases, restrict number of stochastic coefficients to the size of the spectrum (sizeHop = 1/2 sizeFft)*/
+ if(pAnalParams->iStochasticType == SMS_STOC_IFFT)
+ pAnalParams->nStochasticCoeff = sms_power2(pAnalParams->sizeHop);
+
+ /* do the same if spectral envelope is to be stored in frequency bins */
+ if(pAnalParams->specEnvParams.iType == SMS_ENV_FBINS)
+ pAnalParams->specEnvParams.nCoeff = sms_power2(pAnalParams->specEnvParams.iOrder * 2);
+ else if(pAnalParams->specEnvParams.iType == SMS_ENV_CEP)
+ pAnalParams->specEnvParams.nCoeff = pAnalParams->specEnvParams.iOrder+1;
+ /* if specEnvParams.iMaxFreq is still 0, set it to the same as fHighestFreq (normally what you want)*/
+ if(pAnalParams->specEnvParams.iMaxFreq == 0)
+ pAnalParams->specEnvParams.iMaxFreq = pAnalParams->fHighestFreq;
+
+ /*\todo this probably doesn't need env coefficients - they aren't getting used */
+ sms_allocFrame (&pAnalParams->prevFrame, pAnalParams->nGuides,
+ pAnalParams->nStochasticCoeff, 1, pAnalParams->iStochasticType, 0);
+
+ pAnalParams->sizeNextRead = (pAnalParams->iDefaultSizeWindow + 1) * 0.5; /* \todo REMOVE THIS from other files first */
+
+ /* sound buffer */
+ if ((pSoundBuf->pFBuffer = (sfloat *) calloc(sizeBuffer, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return(-1);
+ }
+ pSoundBuf->iMarker = -sizeBuffer;
+ pSoundBuf->iFirstGood = sizeBuffer;
+ pSoundBuf->sizeBuffer = sizeBuffer;
+
+ /* check default fundamental */
+ if (pAnalParams->fDefaultFundamental < pAnalParams->fLowestFundamental)
+ {
+ pAnalParams->fDefaultFundamental = pAnalParams->fLowestFundamental;
+ }
+ if (pAnalParams->fDefaultFundamental > pAnalParams->fHighestFundamental)
+ {
+ pAnalParams->fDefaultFundamental = pAnalParams->fHighestFundamental;
+ }
+
+ /* initialize peak detection/continuation parameters */
+ /*pAnalParams->peakParams.fLowestFreq = pAnalParams->fLowestFundamental;*/
+ /*pAnalParams->peakParams.fHighestFreq = pAnalParams->fHighestFreq;*/
+ /*pAnalParams->peakParams.fMinPeakMag = pAnalParams->fMinPeakMag;*/
+ /*pAnalParams->peakParams.iSamplingRate = pAnalParams->iSamplingRate;*/
+ /*pAnalParams->peakParams.iMaxPeaks = SMS_MAX_NPEAKS;*/
+ /*pAnalParams->peakParams.fHighestFundamental = pAnalParams->fHighestFundamental;*/
+ /*pAnalParams->peakParams.iRefHarmonic = pAnalParams->iRefHarmonic;*/
+ /*pAnalParams->peakParams.fMinRefHarmMag = pAnalParams->fMinRefHarmMag;*/
+ /*pAnalParams->peakParams.fRefHarmMagDiffFromMax = pAnalParams->fRefHarmMagDiffFromMax;*/
+ /*pAnalParams->peakParams.iSoundType = pAnalParams->iSoundType;*/
+
+ /* deterministic synthesis buffer */
+ pSynthBuf->sizeBuffer = pAnalParams->sizeHop << 1;
+ if((pSynthBuf->pFBuffer = (sfloat *)calloc(pSynthBuf->sizeBuffer, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return(-1);
+ }
+ pSynthBuf->iMarker = -sizeBuffer;
+ pSynthBuf->iMarker = pSynthBuf->sizeBuffer;
+
+ /* buffer of analysis frames */
+ if ((pAnalParams->pFrames = (SMS_AnalFrame *) calloc(pAnalParams->iMaxDelayFrames, sizeof(SMS_AnalFrame))) == NULL)
+ {
+ sms_error("could not allocate memory for delay frames");
+ return(-1);
+ }
+ if ((pAnalParams->ppFrames =
+ (SMS_AnalFrame **) calloc(pAnalParams->iMaxDelayFrames, sizeof(SMS_AnalFrame *))) == NULL)
+ {
+ sms_error("could not allocate memory for pointers to delay frames");
+ return(-1);
+ }
+
+ /* initialize the frame pointers and allocate memory */
+ for (i = 0; i < pAnalParams->iMaxDelayFrames; i++)
+ {
+ pAnalParams->pFrames[i].iStatus = SMS_FRAME_EMPTY;
+ if (((pAnalParams->pFrames[i]).pSpectralPeaks =
+ (SMS_Peak *)calloc (pAnalParams->maxPeaks, sizeof(SMS_Peak))) == NULL)
+ {
+ sms_error("could not allocate memory for spectral peaks");
+ return(-1);
+ }
+ (pAnalParams->pFrames[i].deterministic).nTracks = pAnalParams->nGuides;
+ if (((pAnalParams->pFrames[i].deterministic).pFSinFreq =
+ (sfloat *)calloc (pAnalParams->nGuides, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return(-1);
+ }
+ if (((pAnalParams->pFrames[i].deterministic).pFSinAmp =
+ (sfloat *)calloc (pAnalParams->nGuides, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return(-1);
+ }
+ if (((pAnalParams->pFrames[i].deterministic).pFSinPha =
+ (sfloat *) calloc (pAnalParams->nGuides, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return(-1);
+ }
+ pAnalParams->ppFrames[i] = &pAnalParams->pFrames[i];
+ }
+
+ return 0;
}
void sms_changeHopSize(int hopSize, SMS_AnalParams *pAnalParams)
{
- pAnalParams->sizeHop = hopSize;
- pAnalParams->iFrameRate = pAnalParams->iSamplingRate / hopSize;
- int sizeBuffer = (pAnalParams->iMaxDelayFrames * pAnalParams->sizeHop) + SMS_MAX_WINDOW;
- SMS_SndBuffer *pSynthBuf = &pAnalParams->synthBuffer;
- SMS_SndBuffer *pSoundBuf = &pAnalParams->soundBuffer;
-
- /* if storing residual phases, restrict number of stochastic coefficients to the size of the spectrum (sizeHop = 1/2 sizeFft)*/
- if(pAnalParams->iStochasticType == SMS_STOC_IFFT)
- pAnalParams->nStochasticCoeff = sms_power2(pAnalParams->sizeHop);
-
- /* sound buffer */
- if ((pSoundBuf->pFBuffer = (sfloat *) calloc(sizeBuffer, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return;
- }
- pSoundBuf->iMarker = -sizeBuffer;
- pSoundBuf->iFirstGood = sizeBuffer;
- pSoundBuf->sizeBuffer = sizeBuffer;
-
- /* deterministic synthesis buffer */
- pSynthBuf->sizeBuffer = pAnalParams->sizeHop << 1;
- if((pSynthBuf->pFBuffer = (sfloat *)calloc(pSynthBuf->sizeBuffer, sizeof(sfloat))) == NULL)
- {
- sms_error("could not allocate memory");
- return;
- }
- pSynthBuf->iMarker = -sizeBuffer;
- pSynthBuf->iMarker = pSynthBuf->sizeBuffer;
+ pAnalParams->sizeHop = hopSize;
+ pAnalParams->iFrameRate = pAnalParams->iSamplingRate / hopSize;
+ int sizeBuffer = (pAnalParams->iMaxDelayFrames * pAnalParams->sizeHop) + SMS_MAX_WINDOW;
+ SMS_SndBuffer *pSynthBuf = &pAnalParams->synthBuffer;
+ SMS_SndBuffer *pSoundBuf = &pAnalParams->soundBuffer;
+
+ /* if storing residual phases, restrict number of stochastic coefficients to the size of the spectrum (sizeHop = 1/2 sizeFft)*/
+ if(pAnalParams->iStochasticType == SMS_STOC_IFFT)
+ pAnalParams->nStochasticCoeff = sms_power2(pAnalParams->sizeHop);
+
+ /* sound buffer */
+ if ((pSoundBuf->pFBuffer = (sfloat *) calloc(sizeBuffer, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return;
+ }
+ pSoundBuf->iMarker = -sizeBuffer;
+ pSoundBuf->iFirstGood = sizeBuffer;
+ pSoundBuf->sizeBuffer = sizeBuffer;
+
+ /* deterministic synthesis buffer */
+ pSynthBuf->sizeBuffer = pAnalParams->sizeHop << 1;
+ if((pSynthBuf->pFBuffer = (sfloat *)calloc(pSynthBuf->sizeBuffer, sizeof(sfloat))) == NULL)
+ {
+ sms_error("could not allocate memory");
+ return;
+ }
+ pSynthBuf->iMarker = -sizeBuffer;
+ pSynthBuf->iMarker = pSynthBuf->sizeBuffer;
}
/*! \brief give default values to an SMS_SynthParams struct
@@ -333,16 +335,16 @@ void sms_changeHopSize(int hopSize, SMS_AnalParams *pAnalParams)
*/
void sms_initSynthParams(SMS_SynthParams *synthParams)
{
- synthParams->iSamplingRate = 44100;
- synthParams->iOriginalSRate = 44100;
- synthParams->iSynthesisType = SMS_STYPE_ALL;
- synthParams->iDetSynthType = SMS_DET_IFFT;
- synthParams->sizeHop = SMS_MIN_SIZE_FRAME;
- synthParams->origSizeHop = SMS_MIN_SIZE_FRAME;
- synthParams->nTracks = 60;
- synthParams->iStochasticType = SMS_STOC_APPROX;
- synthParams->nStochasticCoeff = 128;
- synthParams->deemphasisLastValue = 0;
+ synthParams->iSamplingRate = 44100;
+ synthParams->iOriginalSRate = 44100;
+ synthParams->iSynthesisType = SMS_STYPE_ALL;
+ synthParams->iDetSynthType = SMS_DET_IFFT;
+ synthParams->sizeHop = SMS_MIN_SIZE_FRAME;
+ synthParams->origSizeHop = SMS_MIN_SIZE_FRAME;
+ synthParams->nTracks = 60;
+ synthParams->iStochasticType = SMS_STOC_APPROX;
+ synthParams->nStochasticCoeff = 128;
+ synthParams->deemphasisLastValue = 0;
}
/*! \brief initialize synthesis data structure's arrays
@@ -361,65 +363,65 @@ void sms_initSynthParams(SMS_SynthParams *synthParams)
*/
int sms_initSynth(SMS_SynthParams *pSynthParams)
{
- int sizeHop, sizeFft, err;
- /* set synthesis parameters from arguments and header */
-// pSynthParams->iOriginalSRate = pSmsHeader->iSamplingRate;
-// pSynthParams->origSizeHop = pSynthParams->iOriginalSRate / pSmsHeader->iFrameRate;
-// pSynthParams->iStochasticType = pSmsHeader->iStochasticType;
-// if(pSynthParams->iSamplingRate <= 0)
-// pSynthParams->iSamplingRate = pSynthParams->iOriginalSRate;
-
- /* make sure sizeHop is something to the power of 2 */
- sizeHop = sms_power2(pSynthParams->sizeHop);
- if(sizeHop != pSynthParams->sizeHop)
- {
- sms_error("sizeHop was not a power of two.");
- err = -1;
- pSynthParams->sizeHop = sizeHop;
- }
- sizeFft = sizeHop * 2;
-
- pSynthParams->pFStocWindow =(sfloat *) calloc(sizeFft, sizeof(sfloat));
- sms_getWindow( sizeFft, pSynthParams->pFStocWindow, SMS_WIN_HANNING );
- pSynthParams->pFDetWindow = (sfloat *) calloc(sizeFft, sizeof(sfloat));
- sms_getWindow( sizeFft, pSynthParams->pFDetWindow, SMS_WIN_IFFT );
-
- /* allocate memory for analysis data - size of original hopsize */
- /* previous frame to interpolate from */
- /* \todo why is stoch coeff + 1? */
- sms_allocFrame(&pSynthParams->prevFrame, pSynthParams->nTracks,
- pSynthParams->nStochasticCoeff + 1, 1,
- pSynthParams->iStochasticType, 0);
-
- pSynthParams->pSynthBuff = (sfloat *) calloc(sizeFft, sizeof(sfloat));
- pSynthParams->pMagBuff = (sfloat *) calloc(sizeHop, sizeof(sfloat));
- pSynthParams->pPhaseBuff = (sfloat *) calloc(sizeHop, sizeof(sfloat));
- pSynthParams->pSpectra = (sfloat *) calloc(sizeFft, sizeof(sfloat));
-
- /* set/check modification parameters */
-// pSynthParams->modParams.maxFreq = pSmsHeader->iMaxFreq;
-
- return SMS_OK;
+ int sizeHop, sizeFft, err;
+ /* set synthesis parameters from arguments and header */
+ // pSynthParams->iOriginalSRate = pSmsHeader->iSamplingRate;
+ // pSynthParams->origSizeHop = pSynthParams->iOriginalSRate / pSmsHeader->iFrameRate;
+ // pSynthParams->iStochasticType = pSmsHeader->iStochasticType;
+ // if(pSynthParams->iSamplingRate <= 0)
+ // pSynthParams->iSamplingRate = pSynthParams->iOriginalSRate;
+
+ /* make sure sizeHop is something to the power of 2 */
+ sizeHop = sms_power2(pSynthParams->sizeHop);
+ if(sizeHop != pSynthParams->sizeHop)
+ {
+ sms_error("sizeHop was not a power of two.");
+ err = -1;
+ pSynthParams->sizeHop = sizeHop;
+ }
+ sizeFft = sizeHop * 2;
+
+ pSynthParams->pFStocWindow =(sfloat *) calloc(sizeFft, sizeof(sfloat));
+ sms_getWindow( sizeFft, pSynthParams->pFStocWindow, SMS_WIN_HANNING );
+ pSynthParams->pFDetWindow = (sfloat *) calloc(sizeFft, sizeof(sfloat));
+ sms_getWindow( sizeFft, pSynthParams->pFDetWindow, SMS_WIN_IFFT );
+
+ /* allocate memory for analysis data - size of original hopsize */
+ /* previous frame to interpolate from */
+ /* \todo why is stoch coeff + 1? */
+ sms_allocFrame(&pSynthParams->prevFrame, pSynthParams->nTracks,
+ pSynthParams->nStochasticCoeff + 1, 1,
+ pSynthParams->iStochasticType, 0);
+
+ pSynthParams->pSynthBuff = (sfloat *) calloc(sizeFft, sizeof(sfloat));
+ pSynthParams->pMagBuff = (sfloat *) calloc(sizeHop, sizeof(sfloat));
+ pSynthParams->pPhaseBuff = (sfloat *) calloc(sizeHop, sizeof(sfloat));
+ pSynthParams->pSpectra = (sfloat *) calloc(sizeFft, sizeof(sfloat));
+
+ /* set/check modification parameters */
+ // pSynthParams->modParams.maxFreq = pSmsHeader->iMaxFreq;
+
+ return SMS_OK;
}
int sms_changeSynthHop( SMS_SynthParams *pSynthParams, int sizeHop)
{
- int sizeFft = sizeHop * 2;
-
- pSynthParams->pSynthBuff = (sfloat *) realloc(pSynthParams->pSynthBuff, sizeFft * sizeof(sfloat));
- pSynthParams->pSpectra = (sfloat *) realloc(pSynthParams->pSpectra, sizeFft * sizeof(sfloat));
- pSynthParams->pMagBuff = (sfloat *) realloc(pSynthParams->pMagBuff, sizeHop * sizeof(sfloat));
- pSynthParams->pPhaseBuff = (sfloat *) realloc(pSynthParams->pPhaseBuff, sizeHop * sizeof(sfloat));
- pSynthParams->pFStocWindow =
- (sfloat *) realloc(pSynthParams->pFStocWindow, sizeFft * sizeof(sfloat));
- sms_getWindow( sizeFft, pSynthParams->pFStocWindow, SMS_WIN_HANNING );
- pSynthParams->pFDetWindow =
- (sfloat *) realloc(pSynthParams->pFDetWindow, sizeFft * sizeof(sfloat));
- sms_getWindow( sizeFft, pSynthParams->pFDetWindow, SMS_WIN_IFFT );
-
- pSynthParams->sizeHop = sizeHop;
-
- return(SMS_OK);
+ int sizeFft = sizeHop * 2;
+
+ pSynthParams->pSynthBuff = (sfloat *) realloc(pSynthParams->pSynthBuff, sizeFft * sizeof(sfloat));
+ pSynthParams->pSpectra = (sfloat *) realloc(pSynthParams->pSpectra, sizeFft * sizeof(sfloat));
+ pSynthParams->pMagBuff = (sfloat *) realloc(pSynthParams->pMagBuff, sizeHop * sizeof(sfloat));
+ pSynthParams->pPhaseBuff = (sfloat *) realloc(pSynthParams->pPhaseBuff, sizeHop * sizeof(sfloat));
+ pSynthParams->pFStocWindow =
+ (sfloat *) realloc(pSynthParams->pFStocWindow, sizeFft * sizeof(sfloat));
+ sms_getWindow( sizeFft, pSynthParams->pFStocWindow, SMS_WIN_HANNING );
+ pSynthParams->pFDetWindow =
+ (sfloat *) realloc(pSynthParams->pFDetWindow, sizeFft * sizeof(sfloat));
+ sms_getWindow( sizeFft, pSynthParams->pFDetWindow, SMS_WIN_IFFT );
+
+ pSynthParams->sizeHop = sizeHop;
+
+ return(SMS_OK);
}
/*! \brief free analysis data
@@ -431,21 +433,21 @@ int sms_changeSynthHop( SMS_SynthParams *pSynthParams, int sizeHop)
*/
void sms_freeAnalysis( SMS_AnalParams *pAnalParams )
{
- int i;
- for (i = 0; i < pAnalParams->iMaxDelayFrames; i++)
- {
- free((pAnalParams->pFrames[i]).pSpectralPeaks);
- free((pAnalParams->pFrames[i].deterministic).pFSinFreq);
- free((pAnalParams->pFrames[i].deterministic).pFSinAmp);
- free((pAnalParams->pFrames[i].deterministic).pFSinPha);
- }
-
- sms_freeFrame(&pAnalParams->prevFrame);
-// free(pAnalParams->soundBuffer.pFBuffer);
- free(pAnalParams->synthBuffer.pFBuffer);
- free(pAnalParams->pFrames);
- free(pAnalParams->ppFrames);
-// free(pAnalParams->pFSpectrumWindow);
+ int i;
+ for (i = 0; i < pAnalParams->iMaxDelayFrames; i++)
+ {
+ free((pAnalParams->pFrames[i]).pSpectralPeaks);
+ free((pAnalParams->pFrames[i].deterministic).pFSinFreq);
+ free((pAnalParams->pFrames[i].deterministic).pFSinAmp);
+ free((pAnalParams->pFrames[i].deterministic).pFSinPha);
+ }
+
+ sms_freeFrame(&pAnalParams->prevFrame);
+ // free(pAnalParams->soundBuffer.pFBuffer);
+ free(pAnalParams->synthBuffer.pFBuffer);
+ free(pAnalParams->pFrames);
+ free(pAnalParams->ppFrames);
+ // free(pAnalParams->pFSpectrumWindow);
}
@@ -460,13 +462,13 @@ void sms_freeAnalysis( SMS_AnalParams *pAnalParams )
*/
void sms_freeSynth( SMS_SynthParams *pSynthParams )
{
- free(pSynthParams->pFStocWindow);
- free(pSynthParams->pFDetWindow);
- free (pSynthParams->pSynthBuff);
- free (pSynthParams->pSpectra);
- free (pSynthParams->pMagBuff);
- free (pSynthParams->pPhaseBuff);
- sms_freeFrame(&pSynthParams->prevFrame);
+ free(pSynthParams->pFStocWindow);
+ free(pSynthParams->pFDetWindow);
+ free (pSynthParams->pSynthBuff);
+ free (pSynthParams->pSpectra);
+ free (pSynthParams->pMagBuff);
+ free (pSynthParams->pPhaseBuff);
+ sms_freeFrame(&pSynthParams->prevFrame);
}
@@ -481,27 +483,26 @@ void sms_freeSynth( SMS_SynthParams *pSynthParams )
*/
int sms_sizeNextWindow (int iCurrentFrame, SMS_AnalParams *pAnalParams)
{
- sfloat fFund = pAnalParams->ppFrames[iCurrentFrame]->fFundamental,
- fPrevFund = pAnalParams->ppFrames[iCurrentFrame-1]->fFundamental;
- int sizeWindow;
-
- /* if the previous fundamental was stable use it to set the window size */
- if (fPrevFund > 0 &&
- fabs(fPrevFund - fFund) / fFund <= .2)
- sizeWindow = (int) ((pAnalParams->iSamplingRate / fFund) *
- pAnalParams->fSizeWindow * .5) * 2 + 1;
- /* otherwise use the default size window */
- else
- sizeWindow = pAnalParams->iDefaultSizeWindow;
-
- if (sizeWindow > SMS_MAX_WINDOW)
- {
- fprintf (stderr, "sms_sizeNextWindow error: sizeWindow (%d) too big, set to %d\n", sizeWindow,
- SMS_MAX_WINDOW);
- sizeWindow = SMS_MAX_WINDOW;
- }
-
- return (sizeWindow);
+ sfloat fFund = pAnalParams->ppFrames[iCurrentFrame]->fFundamental;
+ sfloat fPrevFund = pAnalParams->ppFrames[iCurrentFrame-1]->fFundamental;
+ int sizeWindow;
+
+ /* if the previous fundamental was stable use it to set the window size */
+ if (fPrevFund > 0 && fabs(fPrevFund - fFund) / fFund <= .2)
+ sizeWindow = (int) ((pAnalParams->iSamplingRate / fFund) *
+ pAnalParams->fSizeWindow * .5) * 2 + 1;
+ /* otherwise use the default size window */
+ else
+ sizeWindow = pAnalParams->iDefaultSizeWindow;
+
+ if (sizeWindow > SMS_MAX_WINDOW)
+ {
+ fprintf (stderr, "sms_sizeNextWindow error: sizeWindow (%d) too big, set to %d\n", sizeWindow,
+ SMS_MAX_WINDOW);
+ sizeWindow = SMS_MAX_WINDOW;
+ }
+
+ return sizeWindow;
}
/*! \brief initialize the current frame
@@ -517,57 +518,48 @@ int sms_sizeNextWindow (int iCurrentFrame, SMS_AnalParams *pAnalParams)
*/
int sms_initFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, int sizeWindow)
{
- /* clear deterministic data */
- memset ((sfloat *) pAnalParams->ppFrames[iCurrentFrame]->deterministic.pFSinFreq, 0,
- sizeof(sfloat) * pAnalParams->nGuides);
- memset ((sfloat *) pAnalParams->ppFrames[iCurrentFrame]->deterministic.pFSinAmp, 0,
- sizeof(sfloat) * pAnalParams->nGuides);
- memset ((sfloat *) pAnalParams->ppFrames[iCurrentFrame]->deterministic.pFSinPha, 0,
- sizeof(sfloat) * pAnalParams->nGuides);
- /* clear peaks */
- memset ((void *) pAnalParams->ppFrames[iCurrentFrame]->pSpectralPeaks, 0,
- sizeof (SMS_Peak) * SMS_MAX_NPEAKS);
-
- pAnalParams->ppFrames[iCurrentFrame]->nPeaks = 0;
- pAnalParams->ppFrames[iCurrentFrame]->fFundamental = 0;
-
- pAnalParams->ppFrames[iCurrentFrame]->iFrameNum =
- pAnalParams->ppFrames[iCurrentFrame - 1]->iFrameNum + 1;
- pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = sizeWindow;
-
- //printf("sizeHop (sms_initFrame #: %d): %d \n", iCurrentFrame, pAnalParams->sizeHop);
- /* if first frame set center of data around 0 */
- if(pAnalParams->ppFrames[iCurrentFrame]->iFrameNum == 1)
- pAnalParams->ppFrames[iCurrentFrame]->iFrameSample = 0;
- /* increment center of data by sizeHop */
- else
- pAnalParams->ppFrames[iCurrentFrame]->iFrameSample =
- pAnalParams->ppFrames[iCurrentFrame-1]->iFrameSample + pAnalParams->sizeHop;
-
- /* check for error */
-// if (pAnalParams->soundBuffer.iMarker >
-// pAnalParams->ppFrames[iCurrentFrame]->iFrameSample - (sizeWindow+1)/2)
-// {
-// sms_error("sms_initFrame: runoff on the sound buffer.");
-// //printf("BLAG: sms_initFrame: runoff on the sound buffer.");
-// return(-1);
-// }
-
-// /* check for end of sound */
- if ((pAnalParams->ppFrames[iCurrentFrame]->iFrameSample + (sizeWindow+1)/2) >= pAnalParams->iSizeSound
- && pAnalParams->iSizeSound > 0)
- {
- pAnalParams->ppFrames[iCurrentFrame]->iFrameNum = -1;
- pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = 0;
- pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_END;
- }
- else
- {
- /* good status, ready to start computing */
- pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_READY;
- }
- return SMS_OK;
-// pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_READY;
+ /* clear deterministic data */
+ memset ((sfloat *) pAnalParams->ppFrames[iCurrentFrame]->deterministic.pFSinFreq, 0,
+ sizeof(sfloat) * pAnalParams->nGuides);
+ memset ((sfloat *) pAnalParams->ppFrames[iCurrentFrame]->deterministic.pFSinAmp, 0,
+ sizeof(sfloat) * pAnalParams->nGuides);
+ memset ((sfloat *) pAnalParams->ppFrames[iCurrentFrame]->deterministic.pFSinPha, 0,
+ sizeof(sfloat) * pAnalParams->nGuides);
+
+ /* clear peaks */
+ memset ((void *) pAnalParams->ppFrames[iCurrentFrame]->pSpectralPeaks, 0,
+ sizeof (SMS_Peak) * pAnalParams->maxPeaks);
+
+ pAnalParams->ppFrames[iCurrentFrame]->nPeaks = 0;
+ pAnalParams->ppFrames[iCurrentFrame]->fFundamental = 0;
+
+ pAnalParams->ppFrames[iCurrentFrame]->iFrameNum =
+ pAnalParams->ppFrames[iCurrentFrame - 1]->iFrameNum + 1;
+ pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = sizeWindow;
+
+ /* if first frame set center of data around 0 */
+ if(pAnalParams->ppFrames[iCurrentFrame]->iFrameNum == 1)
+ pAnalParams->ppFrames[iCurrentFrame]->iFrameSample = 0;
+
+ /* if not, increment center of data by sizeHop */
+ else
+ pAnalParams->ppFrames[iCurrentFrame]->iFrameSample =
+ pAnalParams->ppFrames[iCurrentFrame-1]->iFrameSample + pAnalParams->sizeHop;
+
+ /* check for end of sound */
+ if ((pAnalParams->ppFrames[iCurrentFrame]->iFrameSample + (sizeWindow+1)/2) >= pAnalParams->iSizeSound
+ && pAnalParams->iSizeSound > 0)
+ {
+ pAnalParams->ppFrames[iCurrentFrame]->iFrameNum = -1;
+ pAnalParams->ppFrames[iCurrentFrame]->iFrameSize = 0;
+ pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_END;
+ }
+ else
+ {
+ /* good status, ready to start computing */
+ pAnalParams->ppFrames[iCurrentFrame]->iStatus = SMS_FRAME_READY;
+ }
+ return SMS_OK;
}
/*! \brief get deviation from average fundamental
@@ -578,28 +570,28 @@ int sms_initFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, int sizeWindow
*/
sfloat sms_fundDeviation(SMS_AnalParams *pAnalParams, int iCurrentFrame)
{
- sfloat fFund, fSum = 0, fAverage, fDeviation = 0;
- int i;
-
- /* get the sum of the past few fundamentals */
- for (i = 0; i < pAnalParams->minGoodFrames; i++)
- {
- fFund = pAnalParams->ppFrames[iCurrentFrame-i]->fFundamental;
- if(fFund <= 0)
- return(-1);
- else
- fSum += fFund;
- }
-
- /* find the average */
- fAverage = fSum / pAnalParams->minGoodFrames;
-
- /* get the deviation from the average */
- for (i = 0; i < pAnalParams->minGoodFrames; i++)
- fDeviation += fabs(pAnalParams->ppFrames[iCurrentFrame-i]->fFundamental - fAverage);
-
- /* return the deviation from the average */
- return (fDeviation / (pAnalParams->minGoodFrames * fAverage));
+ sfloat fFund, fSum = 0, fAverage, fDeviation = 0;
+ int i;
+
+ /* get the sum of the past few fundamentals */
+ for (i = 0; i < pAnalParams->minGoodFrames; i++)
+ {
+ fFund = pAnalParams->ppFrames[iCurrentFrame-i]->fFundamental;
+ if(fFund <= 0)
+ return(-1);
+ else
+ fSum += fFund;
+ }
+
+ /* find the average */
+ fAverage = fSum / pAnalParams->minGoodFrames;
+
+ /* get the deviation from the average */
+ for (i = 0; i < pAnalParams->minGoodFrames; i++)
+ fDeviation += fabs(pAnalParams->ppFrames[iCurrentFrame-i]->fFundamental - fAverage);
+
+ /* return the deviation from the average */
+ return (fDeviation / (pAnalParams->minGoodFrames * fAverage));
}
@@ -607,15 +599,15 @@ sfloat sms_fundDeviation(SMS_AnalParams *pAnalParams, int iCurrentFrame)
*
* \param pAnalParams pointer to analysis params
* \return error value \see SMS_ERRORS
-*/
+ */
int sms_createDebugFile (SMS_AnalParams *pAnalParams)
{
- if ((pDebug = fopen(pChDebugFile, "w+")) == NULL)
- {
- fprintf(stderr, "Cannot open debugfile: %s\n", pChDebugFile);
- return(SMS_WRERR);
- }
- else return(SMS_OK);
+ if ((pDebug = fopen(pChDebugFile, "w+")) == NULL)
+ {
+ fprintf(stderr, "Cannot open debugfile: %s\n", pChDebugFile);
+ return(SMS_WRERR);
+ }
+ else return(SMS_OK);
}
/*! \brief function to write to the debug file
@@ -630,14 +622,14 @@ int sms_createDebugFile (SMS_AnalParams *pAnalParams)
* \param sizeBuffer the size of the buffers
*/
void sms_writeDebugData (sfloat *pFBuffer1, sfloat *pFBuffer2,
- sfloat *pFBuffer3, int sizeBuffer)
+ sfloat *pFBuffer3, int sizeBuffer)
{
- int i;
- static int counter = 0;
+ int i;
+ static int counter = 0;
- for (i = 0; i < sizeBuffer; i++)
- fprintf (pDebug, "%d %d %d %d\n", counter++, (int)pFBuffer1[i],
- (int)pFBuffer2[i], (int)pFBuffer3[i]);
+ for (i = 0; i < sizeBuffer; i++)
+ fprintf (pDebug, "%d %d %d %d\n", counter++, (int)pFBuffer1[i],
+ (int)pFBuffer2[i], (int)pFBuffer3[i]);
}
@@ -647,7 +639,7 @@ void sms_writeDebugData (sfloat *pFBuffer1, sfloat *pFBuffer2,
*/
void sms_writeDebugFile ()
{
- fclose (pDebug);
+ fclose (pDebug);
}
/*! \brief convert from magnitude to decibel
@@ -657,11 +649,12 @@ void sms_writeDebugFile ()
*/
sfloat sms_magToDB( sfloat x)
{
- if(x < mag_thresh)
- return(0.);
- else
- //return(20. * log10(x * inv_mag_thresh));
+ if(x < mag_thresh)
+ return 0.0;
+ else
+ //return(20. * log10(x * inv_mag_thresh));
return(TWENTY_OVER_LOG10 * log(x * inv_mag_thresh));
+ /*return(TWENTY_OVER_LOG10 * log(x));*/
}
/*! \brief convert from decibel to magnitude
@@ -671,10 +664,11 @@ sfloat sms_magToDB( sfloat x)
*/
sfloat sms_dBToMag( sfloat x)
{
- if(x < 0.00001)
- return (0.);
- else
- return(mag_thresh * pow(10., x*0.05));
+ if(x < 0.00001)
+ return 0.0;
+ else
+ return(mag_thresh * pow(10., x*0.05));
+ /*return pow(10.0, x*0.05);*/
}
/*! \brief convert an array from magnitude to decibel
@@ -688,9 +682,9 @@ sfloat sms_dBToMag( sfloat x)
*/
void sms_arrayMagToDB( int sizeArray, sfloat *pArray)
{
- int i;
- for( i = 0; i < sizeArray; i++)
- pArray[i] = sms_magToDB(pArray[i]);
+ int i;
+ for( i = 0; i < sizeArray; i++)
+ pArray[i] = sms_magToDB(pArray[i]);
}
/*! \brief convert and array from decibel (0-100) to magnitude (0-1)
@@ -703,9 +697,9 @@ void sms_arrayMagToDB( int sizeArray, sfloat *pArray)
*/
void sms_arrayDBToMag( int sizeArray, sfloat *pArray)
{
- int i;
- for( i = 0; i < sizeArray; i++)
- pArray[i] = sms_dBToMag(pArray[i]);
+ int i;
+ for( i = 0; i < sizeArray; i++)
+ pArray[i] = sms_dBToMag(pArray[i]);
}
/*! \brief set the linear magnitude threshold
*
@@ -716,12 +710,12 @@ void sms_arrayDBToMag( int sizeArray, sfloat *pArray)
*/
void sms_setMagThresh( sfloat x)
{
- /* limit threshold to -100db */
- if(x < 0.00001)
- mag_thresh = 0.00001;
- else
- mag_thresh = x;
- inv_mag_thresh = 1. / mag_thresh;
+ /* limit threshold to -100db */
+ if(x < 0.00001)
+ mag_thresh = 0.00001;
+ else
+ mag_thresh = x;
+ inv_mag_thresh = 1. / mag_thresh;
}
/*! \brief get a string containing information about the error code
@@ -729,8 +723,8 @@ void sms_setMagThresh( sfloat x)
* \param pErrorMessage pointer to error message string
*/
void sms_error(char *pErrorMessage) {
- strncpy(error_message, pErrorMessage, 256);
- error_status = -1;
+ strncpy(error_message, pErrorMessage, 256);
+ error_status = -1;
}
/*! \brief check if an error has been reported
@@ -739,7 +733,7 @@ void sms_error(char *pErrorMessage) {
*/
int sms_errorCheck()
{
- return(error_status);
+ return(error_status);
}
/*! \brief get a string containing information about the last error
@@ -748,12 +742,12 @@ int sms_errorCheck()
*/
char* sms_errorString()
{
- if (error_status)
- {
- error_status = 0;
- return error_message;
- }
- else return NULL;
+ if (error_status)
+ {
+ error_status = 0;
+ return error_message;
+ }
+ else return NULL;
}
/*! \brief random number genorator
@@ -763,9 +757,9 @@ char* sms_errorString()
sfloat sms_random()
{
#ifdef MERSENNE_TWISTER
- return(genrand_real1());
+ return(genrand_real1());
#else
- return((sfloat)(random() * 2 * INV_HALF_MAX));
+ return((sfloat)(random() * 2 * INV_HALF_MAX));
#endif
}
@@ -775,12 +769,12 @@ sfloat sms_random()
*/
sfloat sms_rms(int sizeArray, sfloat *pArray)
{
- int i;
- sfloat mean_squared = 0.;
- for( i = 0; i < sizeArray; i++)
- mean_squared += pArray[i] * pArray[i];
+ int i;
+ sfloat mean_squared = 0.;
+ for( i = 0; i < sizeArray; i++)
+ mean_squared += pArray[i] * pArray[i];
- return(sqrtf(mean_squared / sizeArray));
+ return(sqrtf(mean_squared / sizeArray));
}
/*! \brief make sure a number is a power of 2
@@ -789,23 +783,23 @@ sfloat sms_rms(int sizeArray, sfloat *pArray)
*/
int sms_power2( int n)
{
- int p = -1;
- int N = n;
- while(n)
- {
- n >>= 1;
- p++;
- }
-
- if(1<<p == N) /* n was a power of 2 */
- {
- return(N);
- }
- else /* make the new value larger than n */
- {
- p++;
- return(1<<p);
- }
+ int p = -1;
+ int N = n;
+ while(n)
+ {
+ n >>= 1;
+ p++;
+ }
+
+ if(1<<p == N) /* n was a power of 2 */
+ {
+ return(N);
+ }
+ else /* make the new value larger than n */
+ {
+ p++;
+ return(1<<p);
+ }
}
/*! \brief compute a value for scaling frequency based on the well-tempered scale
@@ -815,7 +809,7 @@ int sms_power2( int n)
*/
sfloat sms_scalarTempered( sfloat x)
{
- return(powf(1.0594630943592953, x));
+ return(powf(1.0594630943592953, x));
}
/*! \brief scale an array of linear frequencies to the well-tempered scale
@@ -825,7 +819,7 @@ sfloat sms_scalarTempered( sfloat x)
*/
void sms_arrayScalarTempered( int sizeArray, sfloat *pArray)
{
- int i;
- for( i = 0; i < sizeArray; i++)
- pArray[i] = sms_scalarTempered(pArray[i]);
+ int i;
+ for( i = 0; i < sizeArray; i++)
+ pArray[i] = sms_scalarTempered(pArray[i]);
}
diff --git a/sms/sms.h b/sms/sms.h
index 265ee29..bedc7d3 100644
--- a/sms/sms.h
+++ b/sms/sms.h
@@ -59,26 +59,26 @@
*/
typedef struct
{
- int iSmsMagic; /*!< identification constant */
- int iHeadBSize; /*!< size in bytes of header */
- int nFrames; /*!< number of data frames */
- int iFrameBSize; /*!< size in bytes of each data frame */
- int iSamplingRate; /*!< samplerate of analysis signal (necessary to recreate residual spectrum */
- int iFormat; /*!< type of data format \see SMS_Format */
- int nTracks; /*!< number of sinusoidal tracks per frame */
- int iFrameRate; /*!< rate in Hz of data frames */
- int iStochasticType; /*!< type stochastic representation */
- int nStochasticCoeff; /*!< number of stochastic coefficients per frame */
- int iEnvType; /*!< type of envelope representation */
- int nEnvCoeff; /*!< number of cepstral coefficents per frame */
- int iMaxFreq; /*!< maximum frequency of peaks (also corresponds to the last bin of the specEnv */
-/* sfloat fAmplitude; /\*!< average amplitude of represented sound. *\/ */
-/* sfloat fFrequency; /\*!< average fundamental frequency *\/ */
-/* int iBegSteadyState; /\*!< record number of begining of steady state. *\/ */
-/* int iEndSteadyState; /\*!< record number of end of steady state. *\/ */
- sfloat fResidualPerc; /*!< percentage of the residual to original */
- int nTextCharacters; /*!< number of text characters */
- char *pChTextCharacters; /*!< Text string relating to the sound */
+ int iSmsMagic; /*!< identification constant */
+ int iHeadBSize; /*!< size in bytes of header */
+ int nFrames; /*!< number of data frames */
+ int iFrameBSize; /*!< size in bytes of each data frame */
+ int iSamplingRate; /*!< samplerate of analysis signal (necessary to recreate residual spectrum */
+ int iFormat; /*!< type of data format \see SMS_Format */
+ int nTracks; /*!< number of sinusoidal tracks per frame */
+ int iFrameRate; /*!< rate in Hz of data frames */
+ int iStochasticType; /*!< type stochastic representation */
+ int nStochasticCoeff; /*!< number of stochastic coefficients per frame */
+ int iEnvType; /*!< type of envelope representation */
+ int nEnvCoeff; /*!< number of cepstral coefficents per frame */
+ int iMaxFreq; /*!< maximum frequency of peaks (also corresponds to the last bin of the specEnv */
+ /* sfloat fAmplitude; /\*!< average amplitude of represented sound. *\/ */
+ /* sfloat fFrequency; /\*!< average fundamental frequency *\/ */
+ /* int iBegSteadyState; /\*!< record number of begining of steady state. *\/ */
+ /* int iEndSteadyState; /\*!< record number of end of steady state. *\/ */
+ sfloat fResidualPerc; /*!< percentage of the residual to original */
+ int nTextCharacters; /*!< number of text characters */
+ char *pChTextCharacters; /*!< Text string relating to the sound */
} SMS_Header;
/*! \struct SMS_Data
@@ -95,16 +95,16 @@ typedef struct
*/
typedef struct
{
- sfloat *pSmsData; /*!< pointer to all SMS data */
- int sizeData; /*!< size of all the data */
- sfloat *pFSinFreq; /*!< frequency of sinusoids */
- sfloat *pFSinAmp; /*!< magnitude of sinusoids (stored in dB) */
- sfloat *pFSinPha; /*!< phase of sinusoids */
- int nTracks; /*!< number of sinusoidal tracks in frame */
- sfloat *pFStocGain; /*!< gain of stochastic component */
- int nCoeff; /*!< number of filter coefficients */
- sfloat *pFStocCoeff; /*!< filter coefficients for stochastic component */
- sfloat *pResPhase; /*!< residual phase spectrum */
+ sfloat *pSmsData; /*!< pointer to all SMS data */
+ int sizeData; /*!< size of all the data */
+ sfloat *pFSinFreq; /*!< frequency of sinusoids */
+ sfloat *pFSinAmp; /*!< magnitude of sinusoids (stored in dB) */
+ sfloat *pFSinPha; /*!< phase of sinusoids */
+ int nTracks; /*!< number of sinusoidal tracks in frame */
+ sfloat *pFStocGain; /*!< gain of stochastic component */
+ int nCoeff; /*!< number of filter coefficients */
+ sfloat *pFStocCoeff; /*!< filter coefficients for stochastic component */
+ sfloat *pResPhase; /*!< residual phase spectrum */
int nEnvCoeff; /*!< number of spectral envelope coefficients */
sfloat *pSpecEnv;
} SMS_Data;
@@ -120,10 +120,10 @@ typedef struct
*/
typedef struct
{
- sfloat *pFBuffer; /*!< buffer for sound data*/
- int sizeBuffer; /*!< size of buffer */
- int iMarker; /*!< sample marker relating to sound source */
- int iFirstGood; /*!< first sample in buffer that is a good one */
+ sfloat *pFBuffer; /*!< buffer for sound data*/
+ int sizeBuffer; /*!< size of buffer */
+ int iMarker; /*!< sample marker relating to sound source */
+ int iFirstGood; /*!< first sample in buffer that is a good one */
} SMS_SndBuffer;
/*! \struct SMS_Peak
@@ -133,17 +133,17 @@ typedef struct
/* information attached to a spectral peak */
typedef struct
{
- sfloat fFreq; /*!< frequency of peak */
- sfloat fMag; /*!< magnitude of peak */
- sfloat fPhase; /*!< phase of peak */
+ sfloat fFreq; /*!< frequency of peak */
+ sfloat fMag; /*!< magnitude of peak */
+ sfloat fPhase; /*!< phase of peak */
} SMS_Peak;
/* a collection of spectral peaks */
typedef struct
{
- SMS_Peak *pSpectralPeaks;
- int nPeaks;
- int nPeaksFound;
+ SMS_Peak *pSpectralPeaks;
+ int nPeaks;
+ int nPeaksFound;
} SMS_SpectralPeaks;
/*! \struct SMS_AnalFrame
@@ -154,35 +154,35 @@ typedef struct
*/
typedef struct
{
- int iFrameSample; /*!< sample number of the middle of the frame */
- int iFrameSize; /*!< number of samples used in the frame */
- int iFrameNum; /*!< frame number */
- SMS_Peak *pSpectralPeaks; /*!< spectral peaks found in frame */
- int nPeaks; /*!< number of peaks found */
- sfloat fFundamental; /*!< fundamental frequency in frame */
- SMS_Data deterministic; /*!< deterministic data */
- int iStatus; /*!< status of frame enumerated by SMS_FRAME_STATUS
- \see SMS_FRAME_STATUS */
+ int iFrameSample; /*!< sample number of the middle of the frame */
+ int iFrameSize; /*!< number of samples used in the frame */
+ int iFrameNum; /*!< frame number */
+ SMS_Peak *pSpectralPeaks; /*!< spectral peaks found in frame */
+ int nPeaks; /*!< number of peaks found */
+ sfloat fFundamental; /*!< fundamental frequency in frame */
+ SMS_Data deterministic; /*!< deterministic data */
+ int iStatus; /*!< status of frame enumerated by SMS_FRAME_STATUS
+ \see SMS_FRAME_STATUS */
} SMS_AnalFrame;
/*! \struct SMS_PeakParams
* \brief structure with useful information for peak detection and continuation
*
*/
-typedef struct
-{
- sfloat fLowestFreq; /*!< the first bin to look for a peak */
- sfloat fHighestFreq; /*!< the last bin to look for a peak */
- sfloat fMinPeakMag; /*!< mininum magnitude to consider as a peak */
- int iSamplingRate; /*!< sampling rate of analysis signal */
- int iMaxPeaks; /*!< maximum number of spectral peaks to look for */
- int nPeaksFound; /*!< the number of peaks found in each analysis */
- sfloat fHighestFundamental;/*!< highest fundamental frequency in Hz */
- int iRefHarmonic; /*!< reference harmonic to use in the fundamental detection */
- sfloat fMinRefHarmMag; /*!< minimum magnitude in dB for reference peak */
- sfloat fRefHarmMagDiffFromMax; /*!< maximum magnitude difference from reference peak to highest peak */
- int iSoundType; /*!< type of sound to be analyzed \see SMS_SOUND_TYPE */
-} SMS_PeakParams;
+//typedef struct
+//{
+// sfloat fLowestFreq; [>!< the first bin to look for a peak <]
+// sfloat fHighestFreq; [>!< the last bin to look for a peak <]
+// sfloat fMinPeakMag; [>!< mininum magnitude to consider as a peak <]
+// int iSamplingRate; [>!< sampling rate of analysis signal <]
+// int iMaxPeaks; [>!< maximum number of spectral peaks to look for <]
+// int nPeaksFound; [>!< the number of peaks found in each analysis <]
+// sfloat fHighestFundamental;[>!< highest fundamental frequency in Hz <]
+// int iRefHarmonic; [>!< reference harmonic to use in the fundamental detection <]
+// sfloat fMinRefHarmMag; [>!< minimum magnitude in dB for reference peak <]
+// sfloat fRefHarmMagDiffFromMax; [>!< maximum magnitude difference from reference peak to highest peak <]
+// int iSoundType; [>!< type of sound to be analyzed \see SMS_SOUND_TYPE <]
+//} SMS_PeakParams;
/*! \struct SMS_SEnvParams;
* \brief structure information and data for spectral enveloping
@@ -190,12 +190,12 @@ typedef struct
*/
typedef struct
{
- int iType; /*!< envelope type \see SMS_SpecEnvType */
- int iOrder; /*!< ceptrum order */
- int iMaxFreq; /*!< maximum frequency covered by the envelope */
- sfloat fLambda; /*!< regularization factor */
- int nCoeff; /*!< number of coefficients (bins) in the envelope */
- int iAnchor; /*!< whether to make anchor points at DC / Nyquist or not */
+ int iType; /*!< envelope type \see SMS_SpecEnvType */
+ int iOrder; /*!< ceptrum order */
+ int iMaxFreq; /*!< maximum frequency covered by the envelope */
+ sfloat fLambda; /*!< regularization factor */
+ int nCoeff; /*!< number of coefficients (bins) in the envelope */
+ int iAnchor; /*!< whether to make anchor points at DC / Nyquist or not */
} SMS_SEnvParams;
@@ -216,54 +216,56 @@ typedef struct
*/
typedef struct
{
- int iDebugMode; /*!< debug codes enumerated by SMS_DBG \see SMS_DBG */
- int iFormat; /*!< analysis format code defined by SMS_Format \see SMS_Format */
- int iSoundType; /*!< type of sound to be analyzed \see SMS_SOUND_TYPE */
- int iStochasticType; /*!< type of stochastic model defined by SMS_StocSynthType \see SMS_StocSynthType */
- int iFrameRate; /*!< rate in Hz of data frames */
- int nStochasticCoeff; /*!< number of stochastic coefficients per frame */
- sfloat fLowestFundamental; /*!< lowest fundamental frequency in Hz */
- sfloat fHighestFundamental;/*!< highest fundamental frequency in Hz */
- sfloat fDefaultFundamental;/*!< default fundamental in Hz */
- sfloat fPeakContToGuide; /*!< contribution of previous peak to current guide (between 0 and 1) */
- sfloat fFundContToGuide; /*!< contribution of current fundamental to current guide (between 0 and 1) */
- sfloat fFreqDeviation; /*!< maximum deviation from peak to peak */
- int iSamplingRate; /*! sampling rate of sound to be analyzed */
- int iDefaultSizeWindow; /*!< default size of analysis window in samples */
- int windowSize; /*!< the current window size */
- int sizeHop; /*!< hop size of analysis window in samples */
- sfloat fSizeWindow; /*!< size of analysis window in number of periods */
- int nTracks; /*!< number of sinusoidal tracks in frame */
- int nGuides; /*!< number of guides used for peak detection and continuation \see SMS_Guide */
- int iCleanTracks; /*!< whether or not to clean sinusoidal tracks */
- //int iEnvelope; /*!< whether or not to compute spectral envelope */
- sfloat fMinRefHarmMag; /*!< minimum magnitude in dB for reference peak */
- sfloat fRefHarmMagDiffFromMax; /*!< maximum magnitude difference from reference peak to highest peak */
- int iRefHarmonic; /*!< reference harmonic to use in the fundamental detection */
- int iMinTrackLength; /*!< minimum length in samples of a given track */
- int iMaxSleepingTime; /*!< maximum sleeping time for a track */
- sfloat fHighestFreq; /*!< highest frequency to be searched */
- sfloat fMinPeakMag; /*!< minimum magnitude in dB for a good peak */
- int iAnalysisDirection; /*!< analysis direction, direct or reverse */
- int iSizeSound; /*!< total size of sound to be analyzed in samples */
- int nFrames; /*!< total number of frames that will be analyzed */
- int iWindowType; /*!< type of FFT analysis window \see SMS_WINDOWS */
- int iMaxDelayFrames; /*!< maximum number of frames to delay before peak continuation */
- int minGoodFrames; /*!< minimum number of stable frames for backward search */
- sfloat maxDeviation; /*!< maximum deviation allowed */
- int analDelay; /*! number of frames in the past to be looked in possible re-analyze */
- sfloat fResidualAccumPerc; /*!< accumalitive residual percentage */
- int sizeNextRead; /*!< size of samples to read from sound file next analysis */
- sfloat preEmphasisLastValue;
- int resetGuides;
- int resetGuideStates;
- SMS_PeakParams peakParams; /*!< structure with parameters for spectral peaks */
- SMS_Data prevFrame; /*!< the previous analysis frame */
- SMS_SEnvParams specEnvParams; /*!< all data for spectral enveloping */
- SMS_SndBuffer soundBuffer; /*!< signal to be analyzed */
- SMS_SndBuffer synthBuffer; /*!< resynthesized signal used to create the residual */
- SMS_AnalFrame *pFrames; /*!< an array of frames that have already been analyzed */
- SMS_AnalFrame **ppFrames; /*!< pointers to the frames analyzed (it is circular-shifted once the array is full */
+ int iDebugMode; /*!< debug codes enumerated by SMS_DBG \see SMS_DBG */
+ int iFormat; /*!< analysis format code defined by SMS_Format \see SMS_Format */
+ int iSoundType; /*!< type of sound to be analyzed \see SMS_SOUND_TYPE */
+ int iStochasticType; /*!< type of stochastic model defined by SMS_StocSynthType \see SMS_StocSynthType */
+ int iFrameRate; /*!< rate in Hz of data frames */
+ int nStochasticCoeff; /*!< number of stochastic coefficients per frame */
+ sfloat fLowestFundamental; /*!< lowest fundamental frequency in Hz */
+ sfloat fHighestFundamental;/*!< highest fundamental frequency in Hz */
+ sfloat fDefaultFundamental;/*!< default fundamental in Hz */
+ sfloat fPeakContToGuide; /*!< contribution of previous peak to current guide (between 0 and 1) */
+ sfloat fFundContToGuide; /*!< contribution of current fundamental to current guide (between 0 and 1) */
+ sfloat fFreqDeviation; /*!< maximum deviation from peak to peak */
+ int iSamplingRate; /*! sampling rate of sound to be analyzed */
+ int iDefaultSizeWindow; /*!< default size of analysis window in samples */
+ int windowSize; /*!< the current window size */
+ int sizeHop; /*!< hop size of analysis window in samples */
+ sfloat fSizeWindow; /*!< size of analysis window in number of periods */
+ int nTracks; /*!< number of sinusoidal tracks in frame */
+ int maxPeaks; /*!< maximum number of peaks in a frame */
+ int nGuides; /*!< number of guides used for peak detection and continuation \see SMS_Guide */
+ int iCleanTracks; /*!< whether or not to clean sinusoidal tracks */
+ //int iEnvelope; /*!< whether or not to compute spectral envelope */
+ sfloat fMinRefHarmMag; /*!< minimum magnitude in dB for reference peak */
+ sfloat fRefHarmMagDiffFromMax; /*!< maximum magnitude difference from reference peak to highest peak */
+ int iRefHarmonic; /*!< reference harmonic to use in the fundamental detection */
+ int iMinTrackLength; /*!< minimum length in samples of a given track */
+ int iMaxSleepingTime; /*!< maximum sleeping time for a track */
+ sfloat fLowestFreq; /*!< lowest frequency to be searched */
+ sfloat fHighestFreq; /*!< highest frequency to be searched */
+ sfloat fMinPeakMag; /*!< minimum magnitude in dB for a good peak */
+ int iAnalysisDirection; /*!< analysis direction, direct or reverse */
+ int iSizeSound; /*!< total size of sound to be analyzed in samples */
+ int nFrames; /*!< total number of frames that will be analyzed */
+ int iWindowType; /*!< type of FFT analysis window \see SMS_WINDOWS */
+ int iMaxDelayFrames; /*!< maximum number of frames to delay before peak continuation */
+ int minGoodFrames; /*!< minimum number of stable frames for backward search */
+ sfloat maxDeviation; /*!< maximum deviation allowed */
+ int analDelay; /*! number of frames in the past to be looked in possible re-analyze */
+ sfloat fResidualAccumPerc; /*!< accumalitive residual percentage */
+ int sizeNextRead; /*!< size of samples to read from sound file next analysis */
+ sfloat preEmphasisLastValue;
+ int resetGuides;
+ int resetGuideStates;
+ //SMS_PeakParams peakParams; [>!< structure with parameters for spectral peaks <]
+ SMS_Data prevFrame; /*!< the previous analysis frame */
+ SMS_SEnvParams specEnvParams; /*!< all data for spectral enveloping */
+ SMS_SndBuffer soundBuffer; /*!< signal to be analyzed */
+ SMS_SndBuffer synthBuffer; /*!< resynthesized signal used to create the residual */
+ SMS_AnalFrame *pFrames; /*!< an array of frames that have already been analyzed */
+ SMS_AnalFrame **ppFrames; /*!< pointers to the frames analyzed (it is circular-shifted once the array is full */
} SMS_AnalParams;
/*! \struct SMS_ModifyParams
@@ -272,20 +274,20 @@ typedef struct
*/
typedef struct
{
- int ready; /*!< a flag to know if the struct has been initialized) */
- int maxFreq; /*!< maximum frequency component */
- int doResGain; /*!< whether or not to scale residual gain */
- sfloat resGain; /*!< residual scale factor */
- int doTranspose; /*!< whether or not to transpose */
- sfloat transpose; /*!< transposition factor */
- int doSinEnv; /*!< whether or not to apply a new spectral envelope to the sin component */
- sfloat sinEnvInterp; /*!< value between 0 (use frame's env) and 1 (use *env). Interpolates inbetween values*/
- int sizeSinEnv; /*!< size of the envelope pointed to by env */
- sfloat *sinEnv; /*!< sinusoidal spectral envelope */
- int doResEnv; /*!< whether or not to apply a new spectral envelope to the residual component */
- sfloat resEnvInterp; /*!< value between 0 (use frame's env) and 1 (use *env). Interpolates inbetween values*/
- int sizeResEnv; /*!< size of the envelope pointed to by resEnv */
- sfloat *resEnv; /*!< residual spectral envelope */
+ int ready; /*!< a flag to know if the struct has been initialized) */
+ int maxFreq; /*!< maximum frequency component */
+ int doResGain; /*!< whether or not to scale residual gain */
+ sfloat resGain; /*!< residual scale factor */
+ int doTranspose; /*!< whether or not to transpose */
+ sfloat transpose; /*!< transposition factor */
+ int doSinEnv; /*!< whether or not to apply a new spectral envelope to the sin component */
+ sfloat sinEnvInterp; /*!< value between 0 (use frame's env) and 1 (use *env). Interpolates inbetween values*/
+ int sizeSinEnv; /*!< size of the envelope pointed to by env */
+ sfloat *sinEnv; /*!< sinusoidal spectral envelope */
+ int doResEnv; /*!< whether or not to apply a new spectral envelope to the residual component */
+ sfloat resEnvInterp; /*!< value between 0 (use frame's env) and 1 (use *env). Interpolates inbetween values*/
+ int sizeResEnv; /*!< size of the envelope pointed to by resEnv */
+ sfloat *resEnv; /*!< residual spectral envelope */
} SMS_ModifyParams;
/*! \struct SMS_SynthParams
@@ -298,24 +300,24 @@ typedef struct
*/
typedef struct
{
- int iStochasticType; /*!< type of stochastic model defined by SMS_StocSynthType \see SMS_StocSynthType */
- int iSynthesisType; /*!< type of synthesis to perform \see SMS_SynthType */
- int iDetSynthType; /*!< method for synthesizing deterministic component \see SMS_DetSynthType */
- int iOriginalSRate; /*!< samplerate of the sound model source (for stochastic synthesis approximation) */
- int iSamplingRate; /*!< synthesis samplerate */
- int sizeHop; /*!< number of samples to synthesis for each frame */
- int origSizeHop; /*!< original number of samples used to create each analysis frame */
- int nTracks;
- int nStochasticCoeff;
- sfloat deemphasisLastValue;
- sfloat *pFDetWindow; /*!< array to hold the window used for deterministic synthesis \see SMS_WIN_IFFT */
- sfloat *pFStocWindow; /*!< array to hold the window used for stochastic synthesis (Hanning) */
- sfloat *pSynthBuff; /*!< an array for keeping samples during overlap-add (2x sizeHop) */
- sfloat *pMagBuff; /*!< an array for keeping magnitude spectrum for stochastic synthesis */
- sfloat *pPhaseBuff; /*!< an array for keeping phase spectrum for stochastic synthesis */
- sfloat *pSpectra; /*!< array for in-place FFT transform */
- SMS_Data prevFrame; /*!< previous data frame, for interpolation between frames */
- SMS_ModifyParams modParams; /*!< modification parameters */
+ int iStochasticType; /*!< type of stochastic model defined by SMS_StocSynthType \see SMS_StocSynthType */
+ int iSynthesisType; /*!< type of synthesis to perform \see SMS_SynthType */
+ int iDetSynthType; /*!< method for synthesizing deterministic component \see SMS_DetSynthType */
+ int iOriginalSRate; /*!< samplerate of the sound model source (for stochastic synthesis approximation) */
+ int iSamplingRate; /*!< synthesis samplerate */
+ int sizeHop; /*!< number of samples to synthesis for each frame */
+ int origSizeHop; /*!< original number of samples used to create each analysis frame */
+ int nTracks;
+ int nStochasticCoeff;
+ sfloat deemphasisLastValue;
+ sfloat *pFDetWindow; /*!< array to hold the window used for deterministic synthesis \see SMS_WIN_IFFT */
+ sfloat *pFStocWindow; /*!< array to hold the window used for stochastic synthesis (Hanning) */
+ sfloat *pSynthBuff; /*!< an array for keeping samples during overlap-add (2x sizeHop) */
+ sfloat *pMagBuff; /*!< an array for keeping magnitude spectrum for stochastic synthesis */
+ sfloat *pPhaseBuff; /*!< an array for keeping phase spectrum for stochastic synthesis */
+ sfloat *pSpectra; /*!< array for in-place FFT transform */
+ SMS_Data prevFrame; /*!< previous data frame, for interpolation between frames */
+ SMS_ModifyParams modParams; /*!< modification parameters */
} SMS_SynthParams;
/*! \struct SMS_HarmCandidate
@@ -327,11 +329,11 @@ typedef struct
*/
typedef struct
{
- sfloat fFreq; /*!< frequency of harmonic */
- sfloat fMag; /*!< magnitude of harmonic */
- sfloat fMagPerc; /*!< percentage of magnitude */
- sfloat fFreqDev; /*!< deviation from perfect harmonic */
- sfloat fHarmRatio; /*!< percentage of harmonics found */
+ sfloat fFreq; /*!< frequency of harmonic */
+ sfloat fMag; /*!< magnitude of harmonic */
+ sfloat fMagPerc; /*!< percentage of magnitude */
+ sfloat fFreqDev; /*!< deviation from perfect harmonic */
+ sfloat fHarmRatio; /*!< percentage of harmonics found */
} SMS_HarmCandidate;
/*! \struct SMS_ContCandidate
@@ -342,9 +344,9 @@ typedef struct
*/
typedef struct
{
- sfloat fFreqDev; /*!< frequency deviation from guide */
- sfloat fMagDev; /*!< magnitude deviation from guide */
- int iPeak; /*!< peak number (organized according to frequency)*/
+ sfloat fFreqDev; /*!< frequency deviation from guide */
+ sfloat fMagDev; /*!< magnitude deviation from guide */
+ int iPeak; /*!< peak number (organized according to frequency)*/
} SMS_ContCandidate;
/*! \struct SMS_Guide
@@ -357,10 +359,10 @@ typedef struct
*/
typedef struct
{
- sfloat fFreq; /*!< frequency of guide */
- sfloat fMag; /*!< magnitude of guide */
- int iStatus; /*!< status of guide: DEAD, SLEEPING, ACTIVE */
- int iPeakChosen; /*!< peak number chosen by the guide */
+ sfloat fFreq; /*!< frequency of guide */
+ sfloat fMag; /*!< magnitude of guide */
+ int iStatus; /*!< status of guide: DEAD, SLEEPING, ACTIVE */
+ int iPeakChosen; /*!< peak number chosen by the guide */
} SMS_Guide;
/*! \brief analysis format
@@ -373,10 +375,10 @@ typedef struct
*/
enum SMS_Format
{
- SMS_FORMAT_H, /*!< 0, format harmonic */
- SMS_FORMAT_IH, /*!< 1, format inharmonic */
- SMS_FORMAT_HP, /*!< 2, format harmonic with phase */
- SMS_FORMAT_IHP /*!< 3, format inharmonic with phase */
+ SMS_FORMAT_H, /*!< 0, format harmonic */
+ SMS_FORMAT_IH, /*!< 1, format inharmonic */
+ SMS_FORMAT_HP, /*!< 2, format harmonic with phase */
+ SMS_FORMAT_IHP /*!< 3, format inharmonic with phase */
};
/*! \brief synthesis types
@@ -388,9 +390,9 @@ enum SMS_Format
*/
enum SMS_SynthType
{
- SMS_STYPE_ALL, /*!< both components combined */
- SMS_STYPE_DET, /*!< deterministic component alone */
- SMS_STYPE_STOC /*!< stochastic component alone */
+ SMS_STYPE_ALL, /*!< both components combined */
+ SMS_STYPE_DET, /*!< deterministic component alone */
+ SMS_STYPE_STOC /*!< stochastic component alone */
};
/*! \brief synthesis method for deterministic component
@@ -404,8 +406,8 @@ enum SMS_SynthType
*/
enum SMS_DetSynthType
{
- SMS_DET_IFFT, /*!< Inverse Fast Fourier Transform (IFFT) */
- SMS_DET_SIN /*!< Sinusoidal Table Lookup (SIN) */
+ SMS_DET_IFFT, /*!< Inverse Fast Fourier Transform (IFFT) */
+ SMS_DET_SIN /*!< Sinusoidal Table Lookup (SIN) */
};
/*! \brief synthesis method for stochastic component
@@ -431,9 +433,9 @@ enum SMS_DetSynthType
*/
enum SMS_StocSynthType
{
- SMS_STOC_NONE, /*!< 0, no stochastistic component */
- SMS_STOC_APPROX, /*!< 1, Inverse FFT, magnitude approximation and generated phases */
- SMS_STOC_IFFT /*!< 2, inverse FFT, interpolated spectrum (not used) */
+ SMS_STOC_NONE, /*!< 0, no stochastistic component */
+ SMS_STOC_APPROX, /*!< 1, Inverse FFT, magnitude approximation and generated phases */
+ SMS_STOC_IFFT /*!< 2, inverse FFT, interpolated spectrum (not used) */
};
/*! \brief synthesis method for deterministic component
@@ -447,9 +449,9 @@ enum SMS_StocSynthType
*/
enum SMS_SpecEnvType
{
- SMS_ENV_NONE, /*!< none */
- SMS_ENV_CEP, /*!< cepstral coefficients */
- SMS_ENV_FBINS /*!< frequency bins */
+ SMS_ENV_NONE, /*!< none */
+ SMS_ENV_CEP, /*!< cepstral coefficients */
+ SMS_ENV_FBINS /*!< frequency bins */
};
@@ -457,13 +459,13 @@ enum SMS_SpecEnvType
/* \todo remove me */
enum SMS_ERRORS
{
- SMS_OK, /*!< 0, no error*/
- SMS_NOPEN, /*!< 1, couldn't open file */
- SMS_NSMS , /*!< 2, not a SMS file */
- SMS_MALLOC, /*!< 3, couldn't allocate memory */
- SMS_RDERR, /*!< 4, read error */
- SMS_WRERR, /*!< 5, write error */
- SMS_SNDERR /*!< 7, sound IO error */
+ SMS_OK, /*!< 0, no error*/
+ SMS_NOPEN, /*!< 1, couldn't open file */
+ SMS_NSMS , /*!< 2, not a SMS file */
+ SMS_MALLOC, /*!< 3, couldn't allocate memory */
+ SMS_RDERR, /*!< 4, read error */
+ SMS_WRERR, /*!< 5, write error */
+ SMS_SNDERR /*!< 7, sound IO error */
};
/*! \brief debug modes
@@ -472,21 +474,21 @@ enum SMS_ERRORS
*/
enum SMS_DBG
{
- SMS_DBG_NONE, /*!< 0, no debugging */
- SMS_DBG_DET, /*!< 1, not yet implemented \todo make this show main information to look at for discovering the correct deterministic parameters*/
- SMS_DBG_PEAK_DET, /*!< 2, peak detection function */
- SMS_DBG_HARM_DET, /*!< 3, harmonic detection function */
- SMS_DBG_PEAK_CONT, /*!< 4, peak continuation function */
- SMS_DBG_CLEAN_TRAJ, /*!< 5, clean tracks function */
- SMS_DBG_SINE_SYNTH, /*!< 6, sine synthesis function */
- SMS_DBG_STOC_ANAL, /*!< 7, stochastic analysis function */
- SMS_DBG_STOC_SYNTH, /*!< 8, stochastic synthesis function */
- SMS_DBG_SMS_ANAL, /*!< 9, top level analysis function */
- SMS_DBG_ALL, /*!< 10, everything */
- SMS_DBG_RESIDUAL, /*!< 11, write residual to file */
- SMS_DBG_SYNC, /*!< 12, write original, synthesis and residual
- to a text file */
- };
+ SMS_DBG_NONE, /*!< 0, no debugging */
+ SMS_DBG_DET, /*!< 1, not yet implemented \todo make this show main information to look at for discovering the correct deterministic parameters*/
+ SMS_DBG_PEAK_DET, /*!< 2, peak detection function */
+ SMS_DBG_HARM_DET, /*!< 3, harmonic detection function */
+ SMS_DBG_PEAK_CONT, /*!< 4, peak continuation function */
+ SMS_DBG_CLEAN_TRAJ, /*!< 5, clean tracks function */
+ SMS_DBG_SINE_SYNTH, /*!< 6, sine synthesis function */
+ SMS_DBG_STOC_ANAL, /*!< 7, stochastic analysis function */
+ SMS_DBG_STOC_SYNTH, /*!< 8, stochastic synthesis function */
+ SMS_DBG_SMS_ANAL, /*!< 9, top level analysis function */
+ SMS_DBG_ALL, /*!< 10, everything */
+ SMS_DBG_RESIDUAL, /*!< 11, write residual to file */
+ SMS_DBG_SYNC, /*!< 12, write original, synthesis and residual
+ to a text file */
+};
#define SMS_MAX_WINDOW 8190 /*!< \brief maximum size for analysis window */
@@ -496,8 +498,8 @@ enum SMS_DBG
*/
enum SMS_SOUND_TYPE
{
- SMS_SOUND_TYPE_MELODY, /*!< 0, sound composed of several notes */
- SMS_SOUND_TYPE_NOTE /*!< 1, sound composed of a single note */
+ SMS_SOUND_TYPE_MELODY, /*!< 0, sound composed of several notes */
+ SMS_SOUND_TYPE_NOTE /*!< 1, sound composed of a single note */
};
/* \brief direction of analysis
@@ -508,22 +510,22 @@ enum SMS_SOUND_TYPE
*/
enum SMS_DIRECTION
{
- SMS_DIR_FWD, /*!< analysis from left to right */
- SMS_DIR_REV /*!< analysis from right to left */
+ SMS_DIR_FWD, /*!< analysis from left to right */
+ SMS_DIR_REV /*!< analysis from right to left */
};
/* \brief window selection
- */
+*/
enum SMS_WINDOWS
{
- SMS_WIN_HAMMING, /*!< 0: hamming */
- SMS_WIN_BH_62, /*!< 1: blackman-harris, 62dB cutoff */
- SMS_WIN_BH_70, /*!< 2: blackman-harris, 70dB cutoff */
- SMS_WIN_BH_74, /*!< 3: blackman-harris, 74dB cutoff */
- SMS_WIN_BH_92, /*!< 4: blackman-harris, 92dB cutoff */
- SMS_WIN_HANNING, /*!< 5: hanning */
- SMS_WIN_IFFT /*!< 6: window for deterministic synthesis based on the Inverse-FFT algorithm.
- This is a combination of an inverse Blackman-Harris 92dB and a triangular window. */
+ SMS_WIN_HAMMING, /*!< 0: hamming */
+ SMS_WIN_BH_62, /*!< 1: blackman-harris, 62dB cutoff */
+ SMS_WIN_BH_70, /*!< 2: blackman-harris, 70dB cutoff */
+ SMS_WIN_BH_74, /*!< 3: blackman-harris, 74dB cutoff */
+ SMS_WIN_BH_92, /*!< 4: blackman-harris, 92dB cutoff */
+ SMS_WIN_HANNING, /*!< 5: hanning */
+ SMS_WIN_IFFT /*!< 6: window for deterministic synthesis based on the Inverse-FFT algorithm.
+ This is a combination of an inverse Blackman-Harris 92dB and a triangular window. */
};
/*!
@@ -531,17 +533,17 @@ enum SMS_WINDOWS
*/
enum SMS_FRAME_STATUS
{
- SMS_FRAME_EMPTY,
- SMS_FRAME_READY,
- SMS_FRAME_PEAKS_FOUND,
- SMS_FRAME_FUND_FOUND,
- SMS_FRAME_TRAJ_FOUND,
- SMS_FRAME_CLEANED,
- SMS_FRAME_RECOMPUTED,
- SMS_FRAME_DETER_SYNTH,
- SMS_FRAME_STOC_COMPUTED,
- SMS_FRAME_DONE,
- SMS_FRAME_END
+ SMS_FRAME_EMPTY,
+ SMS_FRAME_READY,
+ SMS_FRAME_PEAKS_FOUND,
+ SMS_FRAME_FUND_FOUND,
+ SMS_FRAME_TRAJ_FOUND,
+ SMS_FRAME_CLEANED,
+ SMS_FRAME_RECOMPUTED,
+ SMS_FRAME_DETER_SYNTH,
+ SMS_FRAME_STOC_COMPUTED,
+ SMS_FRAME_DONE,
+ SMS_FRAME_END
};
@@ -575,38 +577,38 @@ void sms_arrayScalarTempered( int sizeArray, sfloat *pArray);
#ifndef MAX
/*! \brief returns the maximum of a and b */
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
/*! \brief returns the minimum of a and b */
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
/*! \} */
/* function declarations */
void sms_setPeaks(SMS_AnalParams *pAnalParams, int numamps, sfloat* amps,
- int numfreqs, sfloat* freqs, int numphases, sfloat* phases);
+ int numfreqs, sfloat* freqs, int numphases, sfloat* phases);
int sms_findPeaks(int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalParams, SMS_SpectralPeaks *pSpectralPeaks);
int sms_findPartials(SMS_Data *pSmsFrame, SMS_AnalParams *pAnalParams);
int sms_findResidual(int sizeSynthesis, sfloat* pSynthesis,
- int sizeOriginal, sfloat* pOriginal,
- int sizeResidual, sfloat* pResidual,
- SMS_AnalParams *analParams);
+ int sizeOriginal, sfloat* pOriginal,
+ int sizeResidual, sfloat* pResidual,
+ SMS_AnalParams *analParams);
int sms_analyze(int sizeWaveform, sfloat *pWaveform, SMS_Data *pSmsData, SMS_AnalParams *pAnalParams);
void sms_analyzeFrame(int iCurrentFrame, SMS_AnalParams *pAnalParams, sfloat fRefFundamental);
-int sms_init( void );
+int sms_init(void);
-void sms_free( void );
+void sms_free(void);
-int sms_initAnalysis ( SMS_AnalParams *pAnalParams);
+int sms_initAnalysis(SMS_AnalParams *pAnalParams);
-void sms_initAnalParams (SMS_AnalParams *pAnalParams);
+void sms_initAnalParams(SMS_AnalParams *pAnalParams);
void sms_changeHopSize(int hopSize, SMS_AnalParams *pAnalParams);
@@ -614,57 +616,54 @@ void sms_initSynthParams(SMS_SynthParams *synthParams);
int sms_initSynth(SMS_SynthParams *pSynthParams);
-int sms_changeSynthHop( SMS_SynthParams *pSynthParams, int sizeHop);
+int sms_changeSynthHop(SMS_SynthParams *pSynthParams, int sizeHop);
-void sms_freeAnalysis (SMS_AnalParams *pAnalParams);
+void sms_freeAnalysis(SMS_AnalParams *pAnalParams);
-void sms_freeSynth( SMS_SynthParams *pSynthParams );
+void sms_freeSynth(SMS_SynthParams *pSynthParams );
-void sms_fillSoundBuffer (int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalParams);
+void sms_fillSoundBuffer(int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalParams);
-void sms_windowCentered (int sizeWindow, sfloat *pWaveform, sfloat *pWindow, int sizeFft, sfloat *pFftBuffer);
+void sms_windowCentered(int sizeWindow, sfloat *pWaveform, sfloat *pWindow, int sizeFft, sfloat *pFftBuffer);
-void sms_getWindow (int sizeWindow, sfloat *pWindow, int iWindowType);
+void sms_getWindow(int sizeWindow, sfloat *pWindow, int iWindowType);
-void sms_scaleWindow (int sizeWindow, sfloat *pWindow);
+void sms_scaleWindow(int sizeWindow, sfloat *pWindow);
-int sms_spectrum (int sizeWindow, sfloat *pWaveform, sfloat *pWindow, int sizeMag,
- sfloat *pMag, sfloat *pPhase);
+int sms_spectrum(int sizeWindow, sfloat *pWaveform, sfloat *pWindow, int sizeMag,
+ sfloat *pMag, sfloat *pPhase);
-int sms_invSpectrum (int sizeWaveform, sfloat *pWaveform, sfloat *pWindow ,
- int sizeMag, sfloat *pMag, sfloat *pPhase);
+int sms_invSpectrum(int sizeWaveform, sfloat *pWaveform, sfloat *pWindow ,
+ int sizeMag, sfloat *pMag, sfloat *pPhase);
/* \todo remove this once invSpectrum is completely implemented */
-int sms_invQuickSpectrumW (sfloat *pFMagSpectrum, sfloat *pFPhaseSpectrum,
- int sizeFft, sfloat *pFWaveform, int sizeWave,
- sfloat *pFWindow);
+int sms_invQuickSpectrumW(sfloat *pFMagSpectrum, sfloat *pFPhaseSpectrum,
+ int sizeFft, sfloat *pFWaveform, int sizeWave,
+ sfloat *pFWindow);
-int sms_spectralApprox (sfloat *pSpec1, int sizeSpec1, int sizeSpec1Used,
- sfloat *pSpec2, int sizeSpec2, int nCoefficients);
+int sms_spectralApprox(sfloat *pSpec1, int sizeSpec1, int sizeSpec1Used,
+ sfloat *pSpec2, int sizeSpec2, int nCoefficients);
-int sms_spectrumMag (int sizeWindow, sfloat *pWaveform, sfloat *pWindow,
- int sizeMag, sfloat *pMag);
-
-void sms_dCepstrum( int sizeCepstrum, sfloat *pCepstrum, int sizeFreq, sfloat *pFreq, sfloat *pMag,
- sfloat fLambda, int iSamplingRate);
+int sms_spectrumMag(int sizeWindow, sfloat *pWaveform, sfloat *pWindow,
+ int sizeMag, sfloat *pMag);
-void sms_dCepstrumEnvelope (int sizeCepstrum, sfloat *pCepstrum, int sizeEnv, sfloat *pEnv);
+void sms_dCepstrum(int sizeCepstrum, sfloat *pCepstrum, int sizeFreq, sfloat *pFreq, sfloat *pMag,
+ sfloat fLambda, int iSamplingRate);
-void sms_spectralEnvelope ( SMS_Data *pSmsData, SMS_SEnvParams *pSpecEnvParams);
+void sms_dCepstrumEnvelope(int sizeCepstrum, sfloat *pCepstrum, int sizeEnv, sfloat *pEnv);
-int sms_sizeNextWindow (int iCurrentFrame, SMS_AnalParams *pAnalParams);
+void sms_spectralEnvelope(SMS_Data *pSmsData, SMS_SEnvParams *pSpecEnvParams);
-sfloat sms_fundDeviation (SMS_AnalParams *pAnalParams, int iCurrentFrame);
+int sms_sizeNextWindow(int iCurrentFrame, SMS_AnalParams *pAnalParams);
-int sms_detectPeaks (int sizeSpec, sfloat *pFMag, sfloat *pPhase,
- SMS_Peak *pSpectralPeaks, SMS_PeakParams *pPeakParams);
+sfloat sms_fundDeviation(SMS_AnalParams *pAnalParams, int iCurrentFrame);
-//void sms_harmDetection (SMS_AnalFrame *pFrame, sfloat fRefFundamental,
-// SMS_PeakParams *pPeakParams);
+int sms_detectPeaks(int sizeSpec, sfloat *pFMag, sfloat *pPhase,
+ SMS_Peak *pSpectralPeaks, SMS_AnalParams *pAnalParams);
sfloat sms_harmDetection(int numPeaks, SMS_Peak* spectralPeaks, sfloat refFundamental,
- sfloat refHarmonic, sfloat lowestFreq, sfloat highestFreq,
- int soundType, sfloat minRefHarmMag, sfloat refHarmMagDiffFromMax);
+ sfloat refHarmonic, sfloat lowestFreq, sfloat highestFreq,
+ int soundType, sfloat minRefHarmMag, sfloat refHarmMagDiffFromMax);
int sms_peakContinuation (int iFrame, SMS_AnalParams *pAnalParams);
@@ -675,8 +674,8 @@ sfloat sms_deEmphasis(sfloat fInput, SMS_SynthParams *pSynthParams);
void sms_cleanTracks (int iCurrentFrame, SMS_AnalParams *pAnalParams);
void sms_scaleDet (sfloat *pSynthBuffer, sfloat *pOriginalBuffer,
- sfloat *pSinAmp, SMS_AnalParams *pAnalParams, int nTracks);
-
+ sfloat *pSinAmp, SMS_AnalParams *pAnalParams, int nTracks);
+
int sms_prepSine (int nTableSize);
int sms_prepSinc (int nTableSize);
@@ -686,38 +685,38 @@ void sms_clearSine( void );
void sms_clearSinc( void );
void sms_synthesize (SMS_Data *pSmsFrame, sfloat*pSynthesis,
- SMS_SynthParams *pSynthParams);
-
+ SMS_SynthParams *pSynthParams);
+
void sms_sineSynthFrame (SMS_Data *pSmsFrame, sfloat *pBuffer,
- int sizeBuffer, SMS_Data *pLastFrame,
- int iSamplingRate);
+ int sizeBuffer, SMS_Data *pLastFrame,
+ int iSamplingRate);
void sms_initHeader (SMS_Header *pSmsHeader);
int sms_getHeader (char *pChFileName, SMS_Header **ppSmsHeader,
- FILE **ppInputFile);
+ FILE **ppInputFile);
void sms_fillHeader (SMS_Header *pSmsHeader, SMS_AnalParams *pAnalParams,
- char *pProgramString);
+ char *pProgramString);
int sms_writeHeader (char *pFileName, SMS_Header *pSmsHeader,
- FILE **ppOutSmsFile);
+ FILE **ppOutSmsFile);
int sms_writeFile (FILE *pSmsFile, SMS_Header *pSmsHeader);
int sms_initFrame (int iCurrentFrame, SMS_AnalParams *pAnalParams,
- int sizeWindow);
-
+ int sizeWindow);
+
int sms_allocFrame (SMS_Data *pSmsFrame, int nTracks, int nCoeff,
- int iPhase, int stochType, int nEnvCoeff);
+ int iPhase, int stochType, int nEnvCoeff);
int sms_allocFrameH (SMS_Header *pSmsHeader, SMS_Data *pSmsFrame);
int sms_getFrame (FILE *pInputFile, SMS_Header *pSmsHeader, int iFrame,
- SMS_Data *pSmsFrame);
+ SMS_Data *pSmsFrame);
int sms_writeFrame (FILE *pSmsFile, SMS_Header *pSmsHeader,
- SMS_Data *pSmsFrame);
+ SMS_Data *pSmsFrame);
void sms_freeFrame (SMS_Data *pSmsFrame);
@@ -732,10 +731,10 @@ int sms_residual (int sizeWindow, sfloat *pSynthesis, sfloat *pOriginal, sfloat
void sms_filterHighPass ( int sizeResidual, sfloat *pResidual, int iSamplingRate);
int sms_stocAnalysis ( int sizeWindow, sfloat *pResidual, sfloat *pWindow,
- SMS_Data *pSmsFrame);
+ SMS_Data *pSmsFrame);
void sms_interpolateFrames (SMS_Data *pSmsFrame1, SMS_Data *pSmsFrame2,
- SMS_Data *pSmsFrameOut, sfloat fInterpFactor);
+ SMS_Data *pSmsFrameOut, sfloat fInterpFactor);
void sms_fft(int sizeFft, sfloat *pArray);
@@ -761,7 +760,7 @@ void sms_modify(SMS_Data *frame, SMS_ModifyParams *params);
int sms_createDebugFile (SMS_AnalParams *pAnalParams);
void sms_writeDebugData (sfloat *pBuffer1, sfloat *pBuffer2,
- sfloat *pBuffer3, int sizeBuffer);
+ sfloat *pBuffer3, int sizeBuffer);
void sms_writeDebugFile ( void );
diff --git a/sms/sms.i b/sms/sms.i
index 5474d80..e091312 100644
--- a/sms/sms.i
+++ b/sms/sms.i
@@ -83,19 +83,19 @@
fLambda, iSamplingRate);
}
int simplsms_detectPeaks(int sizeMag, sfloat *pMag, int sizePhase, sfloat *pPhase,
- SMS_SpectralPeaks *pPeakStruct, SMS_PeakParams *pPeakParams)
+ SMS_SpectralPeaks *pPeakStruct, SMS_AnalParams *pAnalParams)
{
if(sizeMag != sizePhase)
{
sms_error("sizeMag != sizePhase");
return 0;
}
- if(pPeakStruct->nPeaks < pPeakParams->iMaxPeaks)
+ if(pPeakStruct->nPeaks < pAnalParams->maxPeaks)
{
- sms_error("nPeaks in SMS_SpectralPeaks is not large enough (less than SMS_PeakParams.iMaxPeaks)");
+ sms_error("nPeaks in SMS_SpectralPeaks is not large enough (less than SMS_AnalParams.maxPeaks)");
return 0;
}
- pPeakStruct->nPeaksFound = sms_detectPeaks(sizeMag, pMag, pPhase, pPeakStruct->pSpectralPeaks, pPeakParams);
+ pPeakStruct->nPeaksFound = sms_detectPeaks(sizeMag, pMag, pPhase, pPeakStruct->pSpectralPeaks, pAnalParams);
return pPeakStruct->nPeaksFound;
}
int simplsms_spectrum( int sizeWaveform, sfloat *pWaveform, int sizeWindow, sfloat *pWindow,
diff --git a/sms/soundIO.c b/sms/soundIO.c
index 32f5c1d..1de75d6 100644
--- a/sms/soundIO.c
+++ b/sms/soundIO.c
@@ -28,31 +28,30 @@ const char *pChResidualFile = "residual.aiff";
/*! \brief fill the sound buffer
*
- * \param sizeWaveform size of input data
- * \param pWaveform input data
- * \param pAnalParams pointer to structure of analysis parameters
+ * \param sizeWaveform size of input data
+ * \param pWaveform input data
+ * \param pAnalParams pointer to structure of analysis parameters
*/
-void sms_fillSoundBuffer (int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalParams)
+void sms_fillSoundBuffer(int sizeWaveform, sfloat *pWaveform, SMS_AnalParams *pAnalParams)
{
- int i;
- long sizeNewData = (long) sizeWaveform;
+ int i;
+ long sizeNewData = (long)sizeWaveform;
- /* leave space for new data */
- memcpy(pAnalParams->soundBuffer.pFBuffer, pAnalParams->soundBuffer.pFBuffer+sizeNewData,
+ /* leave space for new data */
+ memcpy(pAnalParams->soundBuffer.pFBuffer, pAnalParams->soundBuffer.pFBuffer+sizeNewData,
sizeof(sfloat) * (pAnalParams->soundBuffer.sizeBuffer - sizeNewData));
- pAnalParams->soundBuffer.iFirstGood =
- MAX(0, pAnalParams->soundBuffer.iFirstGood - sizeNewData);
- pAnalParams->soundBuffer.iMarker += sizeNewData;
+ pAnalParams->soundBuffer.iFirstGood = MAX(0, pAnalParams->soundBuffer.iFirstGood - sizeNewData);
+ pAnalParams->soundBuffer.iMarker += sizeNewData;
- /* put the new data in, and do some pre-emphasis */
- if (pAnalParams->iAnalysisDirection == SMS_DIR_REV)
- for (i=0; i<sizeNewData; i++)
- pAnalParams->soundBuffer.pFBuffer[pAnalParams->soundBuffer.sizeBuffer - sizeNewData + i] =
- sms_preEmphasis(pWaveform[sizeNewData - (1+ i)], pAnalParams);
- else
- for (i=0; i<sizeNewData; i++)
- pAnalParams->soundBuffer.pFBuffer[pAnalParams->soundBuffer.sizeBuffer - sizeNewData + i] =
- sms_preEmphasis(pWaveform[i], pAnalParams);
+ /* put the new data in, and do some pre-emphasis */
+ if (pAnalParams->iAnalysisDirection == SMS_DIR_REV)
+ for (i=0; i<sizeNewData; i++)
+ pAnalParams->soundBuffer.pFBuffer[pAnalParams->soundBuffer.sizeBuffer - sizeNewData + i] =
+ sms_preEmphasis(pWaveform[sizeNewData - (1+ i)], pAnalParams);
+ else
+ for (i=0; i<sizeNewData; i++)
+ pAnalParams->soundBuffer.pFBuffer[pAnalParams->soundBuffer.sizeBuffer - sizeNewData + i] =
+ sms_preEmphasis(pWaveform[i], pAnalParams);
}
diff --git a/tests/sms.py b/tests/sms.py
index 4c1f4bb..1159620 100644
--- a/tests/sms.py
+++ b/tests/sms.py
@@ -14,69 +14,97 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-import unittest
-from simpl import pysms as simplsms
import simpl
+from simpl import pysms as simplsms
import pysms
-from scipy.io.wavfile import read
import numpy as np
+from scipy.io.wavfile import read
+import unittest
-FLOAT_PRECISION = 3 # number of decimal places to check for accuracy
-input_file = 'audio/flute.wav'
-audio_in_data = read(input_file)
-audio_in = simpl.asarray(audio_in_data[1]) / 32768.0
-sampling_rate = audio_in_data[0]
-frame_size = 2048
-hop_size = 256
-num_frames = 5
-max_peaks = 10
-max_partials = 3
-num_samples = frame_size + ((num_frames - 1) * hop_size)
-audio_in = audio_in[0:num_samples]
+class TestSimplSMS(unittest.TestCase):
+ FLOAT_PRECISION = 5 # number of decimal places to check for accuracy
+ input_file = 'audio/flute.wav'
+ frame_size = 2048
+ hop_size = 512
+ num_frames = 20
+ num_samples = frame_size + ((num_frames - 1) * hop_size)
+ max_peaks = 10
+ max_partials = 3
-def print_partials(partials):
- for partial in partials:
- print [p.frequency for p in partial.peaks], ":", partial.starting_frame
+ def get_audio(self):
+ audio_data = read(self.input_file)
+ audio = simpl.asarray(audio_data[1]) / 32768.0
+ sampling_rate = audio_data[0]
+ return audio[0:self.num_samples], sampling_rate
-class TestSimplSMS(unittest.TestCase):
-
- def test_size_next_read(self):
- """test_size_next_read
- Make sure pysms PeakDetection is calculating
- the correct value for the size of the next frame."""
+ def pysms_params(self, sampling_rate, max_peaks, num_frames):
pysms.sms_init()
sms_header = pysms.SMS_Header()
analysis_params = pysms.SMS_AnalParams()
snd_header = pysms.SMS_SndHeader()
# Try to open the input file to fill snd_header
- if(pysms.sms_openSF(input_file, snd_header)):
+ if(pysms.sms_openSF(self.input_file, snd_header)):
raise NameError("error opening sound file: " + pysms.sms_errorString())
analysis_params.iSamplingRate = sampling_rate
- analysis_params.iFrameRate = sampling_rate / hop_size
+ analysis_params.iFrameRate = sampling_rate / self.hop_size
analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
analysis_params.fDefaultFundamental = 100
analysis_params.fHighestFreq = 20000
- analysis_params.peakParams.iMaxPeaks = max_peaks
+ analysis_params.nTracks = max_peaks
+ analysis_params.maxPeaks = max_peaks
analysis_params.iMaxDelayFrames = num_frames + 1
analysis_params.analDelay = 0
analysis_params.minGoodFrames = 1
+ analysis_params.iCleanTracks = 0
pysms.sms_initAnalysis(analysis_params, snd_header)
sms_header.nStochasticCoeff = 128
pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
+ return analysis_params, sms_header, snd_header
+ def simplsms_params(self, sampling_rate, max_peaks, num_frames):
+ simplsms.sms_init()
+ sms_header = simplsms.SMS_Header()
+ analysis_params = simplsms.SMS_AnalParams()
+ analysis_params.iSamplingRate = sampling_rate
+ analysis_params.iFrameRate = sampling_rate / self.hop_size
+ analysis_params.iWindowType = simplsms.SMS_WIN_HAMMING
+ analysis_params.fDefaultFundamental = 100
+ analysis_params.fHighestFreq = 20000
+ analysis_params.iMaxDelayFrames = num_frames + 1
+ analysis_params.analDelay = 0
+ analysis_params.minGoodFrames = 1
+ analysis_params.iCleanTracks = 0
+ analysis_params.iFormat = pysms.SMS_FORMAT_HP
+ analysis_params.nTracks = max_peaks
+ analysis_params.maxPeaks = max_peaks
+ simplsms.sms_initAnalysis(analysis_params)
+ sms_header.nStochasticCoeff = 128
+ simplsms.sms_fillHeader(sms_header, analysis_params, "simplsms")
+ return analysis_params, sms_header
+
+ def test_size_next_read(self):
+ """test_size_next_read
+ Make sure pysms PeakDetection is calculating
+ the correct value for the size of the next frame."""
+ audio, sampling_rate = self.get_audio()
+ analysis_params, sms_header, snd_header = self.pysms_params(sampling_rate,
+ self.max_peaks,
+ self.num_frames)
sample_offset = 0
pysms_size_new_data = 0
current_frame = 0
sms_next_read_sizes = []
- while current_frame < num_frames:
+ while current_frame < self.num_frames:
sms_next_read_sizes.append(analysis_params.sizeNextRead)
sample_offset += pysms_size_new_data
- if((sample_offset + analysis_params.sizeNextRead) < num_samples):
+ if((sample_offset + analysis_params.sizeNextRead) < self.num_samples):
pysms_size_new_data = analysis_params.sizeNextRead
else:
- pysms_size_new_data = num_samples - sample_offset
- frame = audio_in[sample_offset:sample_offset + pysms_size_new_data]
+ pysms_size_new_data = self.num_samples - sample_offset
+ # convert frame to floats for libsms
+ frame = audio[sample_offset:sample_offset + pysms_size_new_data]
+ frame = np.array(frame, dtype=np.float32)
analysis_data = pysms.SMS_Data()
pysms.sms_allocFrameH(sms_header, analysis_data)
status = pysms.sms_analyze(frame, analysis_data, analysis_params)
@@ -91,501 +119,486 @@ class TestSimplSMS(unittest.TestCase):
pysms.sms_free()
pd = simpl.SMSPeakDetection()
- pd.hop_size = hop_size
+ pd.hop_size = self.hop_size
current_frame = 0
sample_offset = 0
- size_new_data = 0
- while current_frame < num_frames:
+ while current_frame < self.num_frames:
+ pd.frame_size = pd.get_next_frame_size()
self.assertEquals(sms_next_read_sizes[current_frame], pd.frame_size)
- sample_offset += size_new_data
- size_new_data = pd.frame_size
- pd.find_peaks_in_frame(audio_in[sample_offset:sample_offset + size_new_data])
- pd.frame_size = pd._analysis_params.sizeNextRead
+ pd.find_peaks_in_frame(audio[sample_offset:sample_offset + pd.frame_size])
+ sample_offset += pd.frame_size
current_frame += 1
def test_peak_detection(self):
"""test_peak_detection
- Compare pysms Peaks with SMS peaks. Exact peak
+ Compare simplsms Peaks with SMS peaks. Exact peak
information cannot be retrieved using libsms. Basic peak detection
is performed by sms_detectPeaks, but this is called multiple times
with different frame sizes by sms_analyze. This peak data cannot
be returned from sms_analyze without modifying it, so here
we compare the peaks to a slightly modified version of sms_analyze
- from pysms. The peak values should be the same as those found by
- the pysms find_peaks function. Analyses have to be performed
+ from simplsms. The peak values should be the same as those found by
+ the simplsms find_peaks function. Analyses have to be performed
separately due to libsms implementation issues."""
- pysms.sms_init()
- sms_header = pysms.SMS_Header()
- analysis_params = pysms.SMS_AnalParams()
- analysis_params.iSamplingRate = sampling_rate
- analysis_params.iFrameRate = sampling_rate / hop_size
- sms_header.nStochasticCoeff = 128
- analysis_params.fDefaultFundamental = 100
- analysis_params.fHighestFreq = 20000
- analysis_params.iMaxDelayFrames = num_frames + 1
- analysis_params.analDelay = 0
- analysis_params.minGoodFrames = 1
- analysis_params.iFormat = pysms.SMS_FORMAT_HP
- analysis_params.nTracks = max_peaks
- analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
- simplsms.sms_initAnalysis(analysis_params)
- analysis_params.peakParams.iMaxPeaks = max_peaks
- pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
-
+ audio, sampling_rate = self.get_audio()
+ analysis_params, sms_header = self.simplsms_params(sampling_rate,
+ self.max_peaks,
+ self.num_frames)
sample_offset = 0
size_new_data = 0
current_frame = 0
sms_peaks = []
- while current_frame < num_frames:
+ while current_frame < self.num_frames:
sample_offset += size_new_data
- if((sample_offset + analysis_params.sizeNextRead) < num_samples):
- size_new_data = analysis_params.sizeNextRead
- else:
- size_new_data = num_samples - sample_offset
- frame = audio_in[sample_offset:sample_offset + size_new_data]
- analysis_data = pysms.SMS_Data()
- pysms.sms_allocFrameH(sms_header, analysis_data)
- status = pysms.sms_analyze(frame, analysis_data, analysis_params)
+ size_new_data = analysis_params.sizeNextRead
+ frame = audio[sample_offset:sample_offset + size_new_data]
+ analysis_data = simplsms.SMS_Data()
+ simplsms.sms_allocFrameH(sms_header, analysis_data)
+ status = simplsms.sms_analyze(frame, analysis_data, analysis_params)
# as the no. of frames of delay is > num_frames, sms_analyze should
# never get around to performing partial tracking, and so the return
# value should be 0
self.assertEquals(status, 0)
num_peaks = analysis_data.nTracks
frame_peaks = []
- pysms_freqs = simpl.zeros(num_peaks)
- pysms_amps = simpl.zeros(num_peaks)
- pysms_phases = simpl.zeros(num_peaks)
- analysis_data.getSinFreq(pysms_freqs)
- analysis_data.getSinAmp(pysms_amps)
- analysis_data.getSinPhase(pysms_phases)
+ simplsms_freqs = simpl.zeros(num_peaks)
+ simplsms_amps = simpl.zeros(num_peaks)
+ simplsms_phases = simpl.zeros(num_peaks)
+ analysis_data.getSinFreq(simplsms_freqs)
+ analysis_data.getSinAmp(simplsms_amps)
+ analysis_data.getSinPhase(simplsms_phases)
for i in range(num_peaks):
- p = simpl.Peak()
- p.amplitude = pysms_amps[i]
- p.frequency = pysms_freqs[i]
- p.phase = pysms_phases[i]
- frame_peaks.append(p)
+ if simplsms_amps[i]:
+ p = simpl.Peak()
+ # convert amplitude back to linear
+ p.amplitude = 10**(simplsms_amps[i]/20.0)
+ p.frequency = simplsms_freqs[i]
+ p.phase = simplsms_phases[i]
+ frame_peaks.append(p)
sms_peaks.append(frame_peaks)
current_frame += 1
-
- pysms.sms_freeAnalysis(analysis_params)
- pysms.sms_free()
+ simplsms.sms_freeAnalysis(analysis_params)
+ simplsms.sms_free()
+
+ # get simpl peaks
pd = simpl.SMSPeakDetection()
- pd.hop_size = hop_size
- pd.max_peaks = max_peaks
+ pd.hop_size = self.hop_size
+ pd.max_peaks = self.max_peaks
current_frame = 0
sample_offset = 0
- size_new_data = 0
- pysms_peaks = []
+ simpl_peaks = []
- while current_frame < num_frames:
- sample_offset += size_new_data
- size_new_data = pd.frame_size
- pysms_peaks.append(
- pd.find_peaks_in_frame(audio_in[sample_offset:sample_offset + size_new_data]))
- pd.frame_size = pd._analysis_params.sizeNextRead
+ while current_frame < self.num_frames:
+ pd.frame_size = pd.get_next_frame_size()
+ simpl_peaks.append(
+ pd.find_peaks_in_frame(audio[sample_offset:sample_offset + pd.frame_size]))
+ sample_offset += pd.frame_size
+ #print current_frame, self.num_samples, pd.frame_size, sample_offset
current_frame += 1
# make sure we have the same number of frames
- self.assertEquals(len(sms_peaks), len(pysms_peaks))
-
+ self.assertEquals(len(sms_peaks), len(simpl_peaks))
+
+ # compare data for each frame
for frame_number in range(len(sms_peaks)):
sms_frame = sms_peaks[frame_number]
- pysms_frame = pysms_peaks[frame_number]
+ simpl_frame = simpl_peaks[frame_number]
# make sure we have the same number of peaks in each frame
- self.assertEquals(len(sms_frame), len(pysms_frame))
+ self.assertEquals(len(sms_frame), len(simpl_frame))
# check peak values
for peak_number in range(len(sms_frame)):
+ #print frame_number, peak_number
sms_peak = sms_frame[peak_number]
- pysms_peak = pysms_frame[peak_number]
- self.assertAlmostEquals(sms_peak.amplitude, pysms_peak.amplitude,
- places=FLOAT_PRECISION)
- self.assertAlmostEquals(sms_peak.frequency, pysms_peak.frequency,
- places=FLOAT_PRECISION)
- self.assertAlmostEquals(sms_peak.phase, pysms_peak.phase,
- places=FLOAT_PRECISION)
+ simpl_peak = simpl_frame[peak_number]
+ self.assertAlmostEquals(sms_peak.amplitude, simpl_peak.amplitude,
+ places=self.FLOAT_PRECISION)
+ self.assertAlmostEquals(sms_peak.frequency, simpl_peak.frequency,
+ places=self.FLOAT_PRECISION)
+ self.assertAlmostEquals(sms_peak.phase, simpl_peak.phase,
+ places=self.FLOAT_PRECISION)
- def test_partial_tracking(self):
- """test_partial_tracking
- Compare pysms Partials with SMS partials."""
- pysms.sms_init()
- sms_header = pysms.SMS_Header()
- snd_header = pysms.SMS_SndHeader()
- # Try to open the input file to fill snd_header
- if(pysms.sms_openSF(input_file, snd_header)):
- raise NameError("error opening sound file: " + pysms.sms_errorString())
- analysis_params = pysms.SMS_AnalParams()
- analysis_params.iSamplingRate = sampling_rate
- analysis_params.iFrameRate = sampling_rate / hop_size
- sms_header.nStochasticCoeff = 128
- analysis_params.fDefaultFundamental = 100
- analysis_params.fHighestFreq = 20000
- analysis_params.iMaxDelayFrames = 3
- analysis_params.analDelay = 0
- analysis_params.minGoodFrames = 1
- analysis_params.iFormat = pysms.SMS_FORMAT_HP
- analysis_params.nTracks = max_partials
- analysis_params.nGuides = max_partials
- analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
- pysms.sms_initAnalysis(analysis_params, snd_header)
- analysis_params.nFrames = num_samples / hop_size
- analysis_params.iSizeSound = num_samples
- analysis_params.peakParams.iMaxPeaks = max_peaks
- analysis_params.iStochasticType = pysms.SMS_STOC_NONE
- pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
+ #def test_partial_tracking(self):
+ # """test_partial_tracking
+ # Compare pysms Partials with SMS partials."""
+ # pysms.sms_init()
+ # sms_header = pysms.SMS_Header()
+ # snd_header = pysms.SMS_SndHeader()
+ # # Try to open the input file to fill snd_header
+ # if(pysms.sms_openSF(input_file, snd_header)):
+ # raise NameError("error opening sound file: " + pysms.sms_errorString())
+ # analysis_params = pysms.SMS_AnalParams()
+ # analysis_params.iSamplingRate = sampling_rate
+ # analysis_params.iFrameRate = sampling_rate / hop_size
+ # sms_header.nStochasticCoeff = 128
+ # analysis_params.fDefaultFundamental = 100
+ # analysis_params.fHighestFreq = 20000
+ # analysis_params.iMaxDelayFrames = 3
+ # analysis_params.analDelay = 0
+ # analysis_params.minGoodFrames = 1
+ # analysis_params.iFormat = pysms.SMS_FORMAT_HP
+ # analysis_params.nTracks = max_partials
+ # analysis_params.nGuides = max_partials
+ # analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
+ # pysms.sms_initAnalysis(analysis_params, snd_header)
+ # analysis_params.nFrames = num_samples / hop_size
+ # analysis_params.iSizeSound = num_samples
+ # analysis_params.peakParams.iMaxPeaks = max_peaks
+ # analysis_params.iStochasticType = pysms.SMS_STOC_NONE
+ # pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
- sample_offset = 0
- size_new_data = 0
- current_frame = 0
- sms_partials = []
- live_partials = [None for i in range(max_partials)]
- do_analysis = True
+ # sample_offset = 0
+ # size_new_data = 0
+ # current_frame = 0
+ # sms_partials = []
+ # live_partials = [None for i in range(max_partials)]
+ # do_analysis = True
- while do_analysis and (current_frame < num_frames):
- sample_offset += size_new_data
- if((sample_offset + analysis_params.sizeNextRead) < num_samples):
- size_new_data = analysis_params.sizeNextRead
- else:
- size_new_data = num_samples - sample_offset
- frame = audio_in[sample_offset:sample_offset + size_new_data]
- analysis_data = pysms.SMS_Data()
- pysms.sms_allocFrameH(sms_header, analysis_data)
- status = pysms.sms_analyze(frame, analysis_data, analysis_params)
+ # while do_analysis and (current_frame < num_frames):
+ # sample_offset += size_new_data
+ # if((sample_offset + analysis_params.sizeNextRead) < num_samples):
+ # size_new_data = analysis_params.sizeNextRead
+ # else:
+ # size_new_data = num_samples - sample_offset
+ # frame = audio[sample_offset:sample_offset + size_new_data]
+ # analysis_data = pysms.SMS_Data()
+ # pysms.sms_allocFrameH(sms_header, analysis_data)
+ # status = pysms.sms_analyze(frame, analysis_data, analysis_params)
- if status == 1:
- num_partials = analysis_data.nTracks
- pysms_freqs = simpl.zeros(num_partials)
- pysms_amps = simpl.zeros(num_partials)
- pysms_phases = simpl.zeros(num_partials)
- analysis_data.getSinFreq(pysms_freqs)
- analysis_data.getSinAmp(pysms_amps)
- analysis_data.getSinPhase(pysms_phases)
- # make partial objects
- for i in range(num_partials):
- # for each partial, if the mag is > 0, this partial is alive
- if pysms_amps[i] > 0:
- # create a peak object
- p = simpl.Peak()
- p.amplitude = pysms_amps[i]
- p.frequency = pysms_freqs[i]
- p.phase = pysms_phases[i]
- # add this peak to the appropriate partial
- if not live_partials[i]:
- live_partials[i] = simpl.Partial()
- live_partials[i].starting_frame = current_frame
- sms_partials.append(live_partials[i])
- live_partials[i].add_peak(p)
- # if the mag is 0 and this partial was alive, kill it
- else:
- if live_partials[i]:
- live_partials[i] = None
- elif status == -1:
- do_analysis = False
- current_frame += 1
+ # if status == 1:
+ # num_partials = analysis_data.nTracks
+ # pysms_freqs = simpl.zeros(num_partials)
+ # pysms_amps = simpl.zeros(num_partials)
+ # pysms_phases = simpl.zeros(num_partials)
+ # analysis_data.getSinFreq(pysms_freqs)
+ # analysis_data.getSinAmp(pysms_amps)
+ # analysis_data.getSinPhase(pysms_phases)
+ # # make partial objects
+ # for i in range(num_partials):
+ # # for each partial, if the mag is > 0, this partial is alive
+ # if pysms_amps[i] > 0:
+ # # create a peak object
+ # p = simpl.Peak()
+ # p.amplitude = pysms_amps[i]
+ # p.frequency = pysms_freqs[i]
+ # p.phase = pysms_phases[i]
+ # # add this peak to the appropriate partial
+ # if not live_partials[i]:
+ # live_partials[i] = simpl.Partial()
+ # live_partials[i].starting_frame = current_frame
+ # sms_partials.append(live_partials[i])
+ # live_partials[i].add_peak(p)
+ # # if the mag is 0 and this partial was alive, kill it
+ # else:
+ # if live_partials[i]:
+ # live_partials[i] = None
+ # elif status == -1:
+ # do_analysis = False
+ # current_frame += 1
- pysms.sms_freeAnalysis(analysis_params)
- pysms.sms_closeSF()
- pysms.sms_free()
+ # pysms.sms_freeAnalysis(analysis_params)
+ # pysms.sms_closeSF()
+ # pysms.sms_free()
- pd = simpl.SMSPeakDetection()
- pd.max_peaks = max_peaks
- pd.hop_size = hop_size
- peaks = pd.find_peaks(audio_in)
- pt = simpl.SMSPartialTracking()
- pt.max_partials = max_partials
- partials = pt.find_partials(peaks[0:num_frames])
+ # pd = simpl.SMSPeakDetection()
+ # pd.max_peaks = max_peaks
+ # pd.hop_size = hop_size
+ # peaks = pd.find_peaks(audio)
+ # pt = simpl.SMSPartialTracking()
+ # pt.max_partials = max_partials
+ # partials = pt.find_partials(peaks[0:num_frames])
- # make sure both have the same number of partials
- self.assertEquals(len(sms_partials), len(partials))
+ # # make sure both have the same number of partials
+ # self.assertEquals(len(sms_partials), len(partials))
- # make sure each partial is the same
- for i in range(len(sms_partials)):
- self.assertEquals(sms_partials[i].get_length(), partials[i].get_length())
- for peak_number in range(sms_partials[i].get_length()):
- self.assertAlmostEquals(sms_partials[i].peaks[peak_number].amplitude,
- partials[i].peaks[peak_number].amplitude,
- places = FLOAT_PRECISION)
- self.assertAlmostEquals(sms_partials[i].peaks[peak_number].frequency,
- partials[i].peaks[peak_number].frequency,
- places = FLOAT_PRECISION)
- self.assertAlmostEquals(sms_partials[i].peaks[peak_number].phase,
- partials[i].peaks[peak_number].phase,
- places = FLOAT_PRECISION)
+ # # make sure each partial is the same
+ # for i in range(len(sms_partials)):
+ # self.assertEquals(sms_partials[i].get_length(), partials[i].get_length())
+ # for peak_number in range(sms_partials[i].get_length()):
+ # self.assertAlmostEquals(sms_partials[i].peaks[peak_number].amplitude,
+ # partials[i].peaks[peak_number].amplitude,
+ # places = FLOAT_PRECISION)
+ # self.assertAlmostEquals(sms_partials[i].peaks[peak_number].frequency,
+ # partials[i].peaks[peak_number].frequency,
+ # places = FLOAT_PRECISION)
+ # self.assertAlmostEquals(sms_partials[i].peaks[peak_number].phase,
+ # partials[i].peaks[peak_number].phase,
+ # places = FLOAT_PRECISION)
- def test_interpolate_frames(self):
- """test_interpolate_frames
- Make sure that pysms.sms_interpolateFrames returns the expected values
- with interpolation factors of 0 and 1."""
- pysms.sms_init()
- sms_header = pysms.SMS_Header()
- snd_header = pysms.SMS_SndHeader()
- # Try to open the input file to fill snd_header
- if(pysms.sms_openSF(input_file, snd_header)):
- raise NameError("error opening sound file: " + pysms.sms_errorString())
- analysis_params = pysms.SMS_AnalParams()
- analysis_params.iSamplingRate = 44100
- analysis_params.iFrameRate = sampling_rate / hop_size
- sms_header.nStochasticCoeff = 128
- analysis_params.fDefaultFundamental = 100
- analysis_params.fHighestFreq = 20000
- analysis_params.iMaxDelayFrames = 3
- analysis_params.analDelay = 0
- analysis_params.minGoodFrames = 1
- analysis_params.iFormat = pysms.SMS_FORMAT_HP
- analysis_params.nTracks = max_partials
- analysis_params.nGuides = max_partials
- analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
- pysms.sms_initAnalysis(analysis_params, snd_header)
- analysis_params.nFrames = num_samples / hop_size
- analysis_params.iSizeSound = num_samples
- analysis_params.peakParams.iMaxPeaks = max_peaks
- analysis_params.iStochasticType = pysms.SMS_STOC_NONE
- pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
- interp_frame = pysms.SMS_Data()
- pysms.sms_allocFrame(interp_frame, sms_header.nTracks, sms_header.nStochasticCoeff, 1, sms_header.iStochasticType, 0)
+ #def test_interpolate_frames(self):
+ # """test_interpolate_frames
+ # Make sure that pysms.sms_interpolateFrames returns the expected values
+ # with interpolation factors of 0 and 1."""
+ # pysms.sms_init()
+ # sms_header = pysms.SMS_Header()
+ # snd_header = pysms.SMS_SndHeader()
+ # # Try to open the input file to fill snd_header
+ # if(pysms.sms_openSF(input_file, snd_header)):
+ # raise NameError("error opening sound file: " + pysms.sms_errorString())
+ # analysis_params = pysms.SMS_AnalParams()
+ # analysis_params.iSamplingRate = 44100
+ # analysis_params.iFrameRate = sampling_rate / hop_size
+ # sms_header.nStochasticCoeff = 128
+ # analysis_params.fDefaultFundamental = 100
+ # analysis_params.fHighestFreq = 20000
+ # analysis_params.iMaxDelayFrames = 3
+ # analysis_params.analDelay = 0
+ # analysis_params.minGoodFrames = 1
+ # analysis_params.iFormat = pysms.SMS_FORMAT_HP
+ # analysis_params.nTracks = max_partials
+ # analysis_params.nGuides = max_partials
+ # analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
+ # pysms.sms_initAnalysis(analysis_params, snd_header)
+ # analysis_params.nFrames = num_samples / hop_size
+ # analysis_params.iSizeSound = num_samples
+ # analysis_params.peakParams.iMaxPeaks = max_peaks
+ # analysis_params.iStochasticType = pysms.SMS_STOC_NONE
+ # pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
+ # interp_frame = pysms.SMS_Data()
+ # pysms.sms_allocFrame(interp_frame, sms_header.nTracks, sms_header.nStochasticCoeff, 1, sms_header.iStochasticType, 0)
- sample_offset = 0
- size_new_data = 0
- current_frame = 0
- sms_header.nFrames = num_frames
- analysis_frames = []
- do_analysis = True
+ # sample_offset = 0
+ # size_new_data = 0
+ # current_frame = 0
+ # sms_header.nFrames = num_frames
+ # analysis_frames = []
+ # do_analysis = True
- while do_analysis and (current_frame < num_frames):
- sample_offset += size_new_data
- if((sample_offset + analysis_params.sizeNextRead) < num_samples):
- size_new_data = analysis_params.sizeNextRead
- else:
- size_new_data = num_samples - sample_offset
- frame = audio_in[sample_offset:sample_offset + size_new_data]
- analysis_data = pysms.SMS_Data()
- pysms.sms_allocFrameH(sms_header, analysis_data)
- status = pysms.sms_analyze(frame, analysis_data, analysis_params)
+ # while do_analysis and (current_frame < num_frames):
+ # sample_offset += size_new_data
+ # if((sample_offset + analysis_params.sizeNextRead) < num_samples):
+ # size_new_data = analysis_params.sizeNextRead
+ # else:
+ # size_new_data = num_samples - sample_offset
+ # frame = audio[sample_offset:sample_offset + size_new_data]
+ # analysis_data = pysms.SMS_Data()
+ # pysms.sms_allocFrameH(sms_header, analysis_data)
+ # status = pysms.sms_analyze(frame, analysis_data, analysis_params)
- if status == 1:
- analysis_frames.append(analysis_data)
- # test interpolateFrames on the last two analysis frames
- if current_frame == num_frames - 1:
- left_frame = analysis_frames[-2]
- right_frame = analysis_frames[-1]
- pysms.sms_interpolateFrames(left_frame, right_frame, interp_frame, 0)
- # make sure that interp_frame == left_frame
- # interpolateFrames doesn't interpolate phases so ignore
- left_amps = simpl.zeros(max_partials)
- left_freqs = simpl.zeros(max_partials)
- left_frame.getSinAmp(left_amps)
- left_frame.getSinFreq(left_freqs)
- right_amps = simpl.zeros(max_partials)
- right_freqs = simpl.zeros(max_partials)
- right_frame.getSinAmp(right_amps)
- right_frame.getSinFreq(right_freqs)
- interp_amps = simpl.zeros(max_partials)
- interp_freqs = simpl.zeros(max_partials)
- interp_frame.getSinAmp(interp_amps)
- interp_frame.getSinFreq(interp_freqs)
- for i in range(max_partials):
- self.assertAlmostEquals(left_amps[i], interp_amps[i],
- places = FLOAT_PRECISION)
- if left_freqs[i] != 0:
- self.assertAlmostEquals(left_freqs[i], interp_freqs[i],
- places = FLOAT_PRECISION)
- else:
- self.assertAlmostEquals(right_freqs[i], interp_freqs[i],
- places = FLOAT_PRECISION)
- pysms.sms_interpolateFrames(left_frame, right_frame, interp_frame, 1)
- interp_amps = simpl.zeros(max_partials)
- interp_freqs = simpl.zeros(max_partials)
- interp_frame.getSinAmp(interp_amps)
- interp_frame.getSinFreq(interp_freqs)
- for i in range(max_partials):
- self.assertAlmostEquals(right_amps[i], interp_amps[i],
- places = FLOAT_PRECISION)
- if right_freqs[i] != 0:
- self.assertAlmostEquals(right_freqs[i], interp_freqs[i],
- places = FLOAT_PRECISION)
- else:
- self.assertAlmostEquals(left_freqs[i], interp_freqs[i],
- places = FLOAT_PRECISION)
- elif status == -1:
- raise Exception("AnalysisStoppedEarly")
- current_frame += 1
+ # if status == 1:
+ # analysis_frames.append(analysis_data)
+ # # test interpolateFrames on the last two analysis frames
+ # if current_frame == num_frames - 1:
+ # left_frame = analysis_frames[-2]
+ # right_frame = analysis_frames[-1]
+ # pysms.sms_interpolateFrames(left_frame, right_frame, interp_frame, 0)
+ # # make sure that interp_frame == left_frame
+ # # interpolateFrames doesn't interpolate phases so ignore
+ # left_amps = simpl.zeros(max_partials)
+ # left_freqs = simpl.zeros(max_partials)
+ # left_frame.getSinAmp(left_amps)
+ # left_frame.getSinFreq(left_freqs)
+ # right_amps = simpl.zeros(max_partials)
+ # right_freqs = simpl.zeros(max_partials)
+ # right_frame.getSinAmp(right_amps)
+ # right_frame.getSinFreq(right_freqs)
+ # interp_amps = simpl.zeros(max_partials)
+ # interp_freqs = simpl.zeros(max_partials)
+ # interp_frame.getSinAmp(interp_amps)
+ # interp_frame.getSinFreq(interp_freqs)
+ # for i in range(max_partials):
+ # self.assertAlmostEquals(left_amps[i], interp_amps[i],
+ # places = FLOAT_PRECISION)
+ # if left_freqs[i] != 0:
+ # self.assertAlmostEquals(left_freqs[i], interp_freqs[i],
+ # places = FLOAT_PRECISION)
+ # else:
+ # self.assertAlmostEquals(right_freqs[i], interp_freqs[i],
+ # places = FLOAT_PRECISION)
+ # pysms.sms_interpolateFrames(left_frame, right_frame, interp_frame, 1)
+ # interp_amps = simpl.zeros(max_partials)
+ # interp_freqs = simpl.zeros(max_partials)
+ # interp_frame.getSinAmp(interp_amps)
+ # interp_frame.getSinFreq(interp_freqs)
+ # for i in range(max_partials):
+ # self.assertAlmostEquals(right_amps[i], interp_amps[i],
+ # places = FLOAT_PRECISION)
+ # if right_freqs[i] != 0:
+ # self.assertAlmostEquals(right_freqs[i], interp_freqs[i],
+ # places = FLOAT_PRECISION)
+ # else:
+ # self.assertAlmostEquals(left_freqs[i], interp_freqs[i],
+ # places = FLOAT_PRECISION)
+ # elif status == -1:
+ # raise Exception("AnalysisStoppedEarly")
+ # current_frame += 1
- pysms.sms_freeAnalysis(analysis_params)
- pysms.sms_closeSF()
+ # pysms.sms_freeAnalysis(analysis_params)
+ # pysms.sms_closeSF()
- def test_harmonic_synthesis(self):
- """test_harmonic_synthesis
- Compare pysms synthesised harmonic component with SMS synthesised
- harmonic component."""
- pysms.sms_init()
- sms_header = pysms.SMS_Header()
- snd_header = pysms.SMS_SndHeader()
- # Try to open the input file to fill snd_header
- if(pysms.sms_openSF(input_file, snd_header)):
- raise NameError("error opening sound file: " + pysms.sms_errorString())
- analysis_params = pysms.SMS_AnalParams()
- analysis_params.iSamplingRate = 44100
- analysis_params.iFrameRate = sampling_rate / hop_size
- sms_header.nStochasticCoeff = 128
- analysis_params.fDefaultFundamental = 100
- analysis_params.fHighestFreq = 20000
- analysis_params.iMaxDelayFrames = 3
- analysis_params.analDelay = 0
- analysis_params.minGoodFrames = 1
- analysis_params.iFormat = pysms.SMS_FORMAT_HP
- analysis_params.nTracks = max_partials
- analysis_params.nGuides = max_partials
- analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
- pysms.sms_initAnalysis(analysis_params, snd_header)
- analysis_params.nFrames = num_samples / hop_size
- analysis_params.iSizeSound = num_samples
- analysis_params.peakParams.iMaxPeaks = max_peaks
- analysis_params.iStochasticType = pysms.SMS_STOC_NONE
- pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
+ #def test_harmonic_synthesis(self):
+ # """test_harmonic_synthesis
+ # Compare pysms synthesised harmonic component with SMS synthesised
+ # harmonic component."""
+ # pysms.sms_init()
+ # sms_header = pysms.SMS_Header()
+ # snd_header = pysms.SMS_SndHeader()
+ # # Try to open the input file to fill snd_header
+ # if(pysms.sms_openSF(input_file, snd_header)):
+ # raise NameError("error opening sound file: " + pysms.sms_errorString())
+ # analysis_params = pysms.SMS_AnalParams()
+ # analysis_params.iSamplingRate = 44100
+ # analysis_params.iFrameRate = sampling_rate / hop_size
+ # sms_header.nStochasticCoeff = 128
+ # analysis_params.fDefaultFundamental = 100
+ # analysis_params.fHighestFreq = 20000
+ # analysis_params.iMaxDelayFrames = 3
+ # analysis_params.analDelay = 0
+ # analysis_params.minGoodFrames = 1
+ # analysis_params.iFormat = pysms.SMS_FORMAT_HP
+ # analysis_params.nTracks = max_partials
+ # analysis_params.nGuides = max_partials
+ # analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
+ # pysms.sms_initAnalysis(analysis_params, snd_header)
+ # analysis_params.nFrames = num_samples / hop_size
+ # analysis_params.iSizeSound = num_samples
+ # analysis_params.peakParams.iMaxPeaks = max_peaks
+ # analysis_params.iStochasticType = pysms.SMS_STOC_NONE
+ # pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
- sample_offset = 0
- size_new_data = 0
- current_frame = 0
- sms_header.nFrames = num_frames
- analysis_frames = []
- do_analysis = True
+ # sample_offset = 0
+ # size_new_data = 0
+ # current_frame = 0
+ # sms_header.nFrames = num_frames
+ # analysis_frames = []
+ # do_analysis = True
- while do_analysis and (current_frame < num_frames):
- sample_offset += size_new_data
- if((sample_offset + analysis_params.sizeNextRead) < num_samples):
- size_new_data = analysis_params.sizeNextRead
- else:
- size_new_data = num_samples - sample_offset
- frame = audio_in[sample_offset:sample_offset + size_new_data]
- analysis_data = pysms.SMS_Data()
- pysms.sms_allocFrameH(sms_header, analysis_data)
- status = pysms.sms_analyze(frame, analysis_data, analysis_params)
- analysis_frames.append(analysis_data)
- if status == -1:
- do_analysis = False
- current_frame += 1
+ # while do_analysis and (current_frame < num_frames):
+ # sample_offset += size_new_data
+ # if((sample_offset + analysis_params.sizeNextRead) < num_samples):
+ # size_new_data = analysis_params.sizeNextRead
+ # else:
+ # size_new_data = num_samples - sample_offset
+ # frame = audio[sample_offset:sample_offset + size_new_data]
+ # analysis_data = pysms.SMS_Data()
+ # pysms.sms_allocFrameH(sms_header, analysis_data)
+ # status = pysms.sms_analyze(frame, analysis_data, analysis_params)
+ # analysis_frames.append(analysis_data)
+ # if status == -1:
+ # do_analysis = False
+ # current_frame += 1
- pysms.sms_freeAnalysis(analysis_params)
- pysms.sms_closeSF()
+ # pysms.sms_freeAnalysis(analysis_params)
+ # pysms.sms_closeSF()
- interp_frame = pysms.SMS_Data()
- synth_params = pysms.SMS_SynthParams()
- synth_params.iSynthesisType = pysms.SMS_STYPE_DET
- synth_params.iDetSynthType = pysms.SMS_DET_SIN
- synth_params.sizeHop = hop_size
- synth_params.iSamplingRate = 0
+ # interp_frame = pysms.SMS_Data()
+ # synth_params = pysms.SMS_SynthParams()
+ # synth_params.iSynthesisType = pysms.SMS_STYPE_DET
+ # synth_params.iDetSynthType = pysms.SMS_DET_SIN
+ # synth_params.sizeHop = hop_size
+ # synth_params.iSamplingRate = 0
- pysms.sms_initSynth(sms_header, synth_params)
- pysms.sms_allocFrame(interp_frame, sms_header.nTracks, sms_header.nStochasticCoeff, 1, sms_header.iStochasticType, sms_header.nEnvCoeff)
+ # pysms.sms_initSynth(sms_header, synth_params)
+ # pysms.sms_allocFrame(interp_frame, sms_header.nTracks, sms_header.nStochasticCoeff, 1, sms_header.iStochasticType, sms_header.nEnvCoeff)
- synth_samples = pysms.zeros(synth_params.sizeHop)
- num_synth_samples = 0
- target_synth_samples = len(analysis_frames) * hop_size
- pysms_audio = pysms.array([])
- current_frame = 0
+ # synth_samples = pysms.zeros(synth_params.sizeHop)
+ # num_synth_samples = 0
+ # target_synth_samples = len(analysis_frames) * hop_size
+ # pysms_audio = pysms.array([])
+ # current_frame = 0
- while num_synth_samples < target_synth_samples:
- pysms.sms_synthesize(analysis_frames[current_frame], synth_samples, synth_params)
- pysms_audio = np.hstack((pysms_audio, synth_samples))
- num_synth_samples += synth_params.sizeHop
- current_frame += 1
+ # while num_synth_samples < target_synth_samples:
+ # pysms.sms_synthesize(analysis_frames[current_frame], synth_samples, synth_params)
+ # pysms_audio = np.hstack((pysms_audio, synth_samples))
+ # num_synth_samples += synth_params.sizeHop
+ # current_frame += 1
- pysms.sms_freeSynth(synth_params)
- pysms.sms_free()
+ # pysms.sms_freeSynth(synth_params)
+ # pysms.sms_free()
- pd = simpl.SMSPeakDetection()
- pd.max_peaks = max_peaks
- pd.hop_size = hop_size
- pt = simpl.SMSPartialTracking()
- pt.max_partials = max_partials
- peaks = pd.find_peaks(audio_in)
- partials = pt.find_partials(peaks[0:num_frames])
- synth = simpl.SMSSynthesis()
- synth.hop_size = hop_size
- synth.stochastic_type = pysms.SMS_STOC_NONE
- synth.synthesis_type = pysms.SMS_STYPE_DET
- synth.max_partials = max_partials
- simpl_audio = synth.synth(partials)
+ # pd = simpl.SMSPeakDetection()
+ # pd.max_peaks = max_peaks
+ # pd.hop_size = hop_size
+ # pt = simpl.SMSPartialTracking()
+ # pt.max_partials = max_partials
+ # peaks = pd.find_peaks(audio)
+ # partials = pt.find_partials(peaks[0:num_frames])
+ # synth = simpl.SMSSynthesis()
+ # synth.hop_size = hop_size
+ # synth.stochastic_type = pysms.SMS_STOC_NONE
+ # synth.synthesis_type = pysms.SMS_STYPE_DET
+ # synth.max_partials = max_partials
+ # simpl_audio = synth.synth(partials)
- self.assertEquals(pysms_audio.size, simpl_audio.size)
- for i in range(simpl_audio.size):
- self.assertAlmostEquals(pysms_audio[i], simpl_audio[i],
- places = FLOAT_PRECISION)
+ # self.assertEquals(pysms_audio.size, simpl_audio.size)
+ # for i in range(simpl_audio.size):
+ # self.assertAlmostEquals(pysms_audio[i], simpl_audio[i],
+ # places = FLOAT_PRECISION)
- def test_residual_synthesis(self):
- """test_residual_synthesis
- Compare pysms residual signal with SMS residual"""
- pysms.sms_init()
- sms_header = pysms.SMS_Header()
- snd_header = pysms.SMS_SndHeader()
- # Try to open the input file to fill snd_header
- if(pysms.sms_openSF(input_file, snd_header)):
- raise NameError("error opening sound file: " + pysms.sms_errorString())
- analysis_params = pysms.SMS_AnalParams()
- analysis_params.iSamplingRate = 44100
- analysis_params.iFrameRate = sampling_rate / hop_size
- sms_header.nStochasticCoeff = 128
- analysis_params.fDefaultFundamental = 100
- analysis_params.fHighestFreq = 20000
- analysis_params.iMaxDelayFrames = 3
- analysis_params.analDelay = 0
- analysis_params.minGoodFrames = 1
- analysis_params.iFormat = pysms.SMS_FORMAT_HP
- analysis_params.nTracks = max_partials
- analysis_params.nGuides = max_partials
- analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
- pysms.sms_initAnalysis(analysis_params, snd_header)
- analysis_params.nFrames = num_samples / hop_size
- analysis_params.iSizeSound = num_samples
- analysis_params.peakParams.iMaxPeaks = max_peaks
- analysis_params.iStochasticType = pysms.SMS_STOC_APPROX
- pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
+ #def test_residual_synthesis(self):
+ # """test_residual_synthesis
+ # Compare pysms residual signal with SMS residual"""
+ # pysms.sms_init()
+ # sms_header = pysms.SMS_Header()
+ # snd_header = pysms.SMS_SndHeader()
+ # # Try to open the input file to fill snd_header
+ # if(pysms.sms_openSF(input_file, snd_header)):
+ # raise NameError("error opening sound file: " + pysms.sms_errorString())
+ # analysis_params = pysms.SMS_AnalParams()
+ # analysis_params.iSamplingRate = 44100
+ # analysis_params.iFrameRate = sampling_rate / hop_size
+ # sms_header.nStochasticCoeff = 128
+ # analysis_params.fDefaultFundamental = 100
+ # analysis_params.fHighestFreq = 20000
+ # analysis_params.iMaxDelayFrames = 3
+ # analysis_params.analDelay = 0
+ # analysis_params.minGoodFrames = 1
+ # analysis_params.iFormat = pysms.SMS_FORMAT_HP
+ # analysis_params.nTracks = max_partials
+ # analysis_params.nGuides = max_partials
+ # analysis_params.iWindowType = pysms.SMS_WIN_HAMMING
+ # pysms.sms_initAnalysis(analysis_params, snd_header)
+ # analysis_params.nFrames = num_samples / hop_size
+ # analysis_params.iSizeSound = num_samples
+ # analysis_params.peakParams.iMaxPeaks = max_peaks
+ # analysis_params.iStochasticType = pysms.SMS_STOC_APPROX
+ # pysms.sms_fillHeader(sms_header, analysis_params, "pysms")
- sample_offset = 0
- size_new_data = 0
- current_frame = 0
- sms_header.nFrames = num_frames
- analysis_frames = []
- do_analysis = True
+ # sample_offset = 0
+ # size_new_data = 0
+ # current_frame = 0
+ # sms_header.nFrames = num_frames
+ # analysis_frames = []
+ # do_analysis = True
- while do_analysis and (current_frame < num_frames-1):
- sample_offset += size_new_data
- if((sample_offset + analysis_params.sizeNextRead) < num_samples):
- size_new_data = analysis_params.sizeNextRead
- else:
- size_new_data = num_samples - sample_offset
- frame = audio_in[sample_offset:sample_offset + size_new_data]
- analysis_data = pysms.SMS_Data()
- pysms.sms_allocFrameH(sms_header, analysis_data)
- status = pysms.sms_analyze(frame, analysis_data, analysis_params)
- analysis_frames.append(analysis_data)
- if status == -1:
- do_analysis = False
- current_frame += 1
+ # while do_analysis and (current_frame < num_frames-1):
+ # sample_offset += size_new_data
+ # if((sample_offset + analysis_params.sizeNextRead) < num_samples):
+ # size_new_data = analysis_params.sizeNextRead
+ # else:
+ # size_new_data = num_samples - sample_offset
+ # frame = audio[sample_offset:sample_offset + size_new_data]
+ # analysis_data = pysms.SMS_Data()
+ # pysms.sms_allocFrameH(sms_header, analysis_data)
+ # status = pysms.sms_analyze(frame, analysis_data, analysis_params)
+ # analysis_frames.append(analysis_data)
+ # if status == -1:
+ # do_analysis = False
+ # current_frame += 1
- pysms.sms_freeAnalysis(analysis_params)
- pysms.sms_closeSF()
- pysms.sms_free()
+ # pysms.sms_freeAnalysis(analysis_params)
+ # pysms.sms_closeSF()
+ # pysms.sms_free()
- pd = simpl.SMSPeakDetection()
- pd.max_peaks = max_peaks
- pd.hop_size = hop_size
- pt = simpl.SMSPartialTracking()
- pt.max_partials = max_partials
- peaks = pd.find_peaks(audio_in)
- partials = pt.find_partials(peaks[0:num_frames])
- synth = simpl.SMSSynthesis()
- synth.hop_size = hop_size
- synth.stochastic_type = pysms.SMS_STOC_NONE
- synth.synthesis_type = pysms.SMS_STYPE_DET
- synth.max_partials = max_partials
- simpl_harmonic = synth.synth(partials)
- res = simpl.SMSResidual()
- res.num_coefficients = 128
- res.type = simpl.SMSResidual.TIME_DOMAIN
- residual = res.find_residual(simpl_harmonic, audio_in[0:simpl_harmonic.size])
+ # pd = simpl.SMSPeakDetection()
+ # pd.max_peaks = max_peaks
+ # pd.hop_size = hop_size
+ # pt = simpl.SMSPartialTracking()
+ # pt.max_partials = max_partials
+ # peaks = pd.find_peaks(audio)
+ # partials = pt.find_partials(peaks[0:num_frames])
+ # synth = simpl.SMSSynthesis()
+ # synth.hop_size = hop_size
+ # synth.stochastic_type = pysms.SMS_STOC_NONE
+ # synth.synthesis_type = pysms.SMS_STYPE_DET
+ # synth.max_partials = max_partials
+ # simpl_harmonic = synth.synth(partials)
+ # res = simpl.SMSResidual()
+ # res.num_coefficients = 128
+ # res.type = simpl.SMSResidual.TIME_DOMAIN
+ # residual = res.find_residual(simpl_harmonic, audio[0:simpl_harmonic.size])
# print_partials(partials)
# print simpl_harmonic.size
# for i in range(residual.size):
@@ -595,18 +608,19 @@ class TestSimplSMS(unittest.TestCase):
# from pylab import plot, show
# plot(simpl_harmonic)
# plot(residual)
-# plot(audio_in[0:simpl_harmonic.size])
+# plot(audio[0:simpl_harmonic.size])
# show()
# from scipy.io.wavfile import write
# write("res.wav", 44100, residual)
-# res.synth(simpl_harmonic, audio_in)
+# res.synth(simpl_harmonic, audio)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestSimplSMS('test_size_next_read'))
suite.addTest(TestSimplSMS('test_peak_detection'))
- suite.addTest(TestSimplSMS('test_partial_tracking'))
- suite.addTest(TestSimplSMS('test_interpolate_frames'))
- suite.addTest(TestSimplSMS('test_harmonic_synthesis'))
- suite.addTest(TestSimplSMS('test_residual_synthesis'))
+ #suite.addTest(TestSimplSMS('test_partial_tracking'))
+ #suite.addTest(TestSimplSMS('test_interpolate_frames'))
+ #suite.addTest(TestSimplSMS('test_harmonic_synthesis'))
+ #suite.addTest(TestSimplSMS('test_residual_synthesis'))
unittest.TextTestRunner().run(suite)
+