Skip to content

Commit

Permalink
1) Modified the Matlab code generation: in Matlab, paths longer than …
Browse files Browse the repository at this point in the history
…63 characters are not allowed, therefore the code generation shortens the names of the generated property access functions

2) Added a crotation function: modify phase in FFT domain -> circular shift of signal in time domain
  • Loading branch information
hkhauke committed Jan 24, 2024
1 parent 1d21a75 commit c888d26
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 10 deletions.
1 change: 1 addition & 0 deletions cmake/fragments/options.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ set(JVXRT_SUBMODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/sources/sub-projects" CACH
set(JVXRT_SUBMODULE_FLUTTER_PATH "${CMAKE_CURRENT_SOURCE_DIR}/flutter" CACHE STRING "Path to flutter submodules")

set(JVX_DEFINE_NUMBER_32BIT_TOKENS_BITFIELD 16 CACHE STRING "Number of 32 bit tokens in bitfields")
set(JVX_MAX_PATH_PROP_MAT 63 CACHE STRING "Number of characters when generating Matlab property access functions")
set(JVX_DEFAULT_NUMBER_OF_POSTPONE_ATTEMPTS_TEST 10 CACHE STRING "Number of reattempts if chain element returns a POSTPONE")
set(JVX_COMMAND_LINE_TOKENS_BUILDIN "--textlog --verbose_dll --textloglev 10" CACHE STRING "Pre-compiled builtin command args")
set(JVX_QT_SPLASH_TEXT_COLOR "Qt::gray" CACHE STRING "Default color for QT apps splash screen text")
Expand Down
4 changes: 4 additions & 0 deletions cmake/macros.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ macro(jvx_genMatProperties targetname componenttype componentprefix localfilelis
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/m-files/+${targetname_tweaked})
foreach(PCGFILE ${localfilelist})
string(REPLACE ";" " " localoptionsstr "${localoptions}")
if(JVX_MAX_PATH_PROP_MAT)
set(localoptionsstr "${localoptionsstr} -maxl ${JVX_MAX_PATH_PROP_MAT}")
endif()

message(" > PCG MAT Generator: ${PCGFILE} for component of type ${componenttype}, generator prefix ${componentprefix}, local options = ${localoptionsstr}")
# message("exec_program(\"${JVX_PCG_MATLAB} \\\"${PCGFILE}\\\" -o \\\"${CMAKE_CURRENT_BINARY_DIR}/m-files/+${targetname_tweaked}\\\" -ctp ${componenttype} -cpf ${componentprefix} ${localoptionsstr}\")")
# pcg_mat_opts "${localoptions}")
Expand Down
27 changes: 24 additions & 3 deletions software/codeFragments/parser/entryParserTools_out_h1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
#include "textProcessor_core.h"

#ifdef JVX_PROP_MATLAB_OUTPUT
void parseInput(char* argv[], int argc, std::string& inputFName, std::string& outDir, std::string& outCompText, std::string& outCompPrefix, std::vector<std::string>& includePaths, jvxBool& dependencyMode, std::vector<std::string>& ifdefs)
void parseInput(char* argv[], int argc, std::string& inputFName, std::string& outDir, std::string& outCompText,
std::string& outCompPrefix, std::vector<std::string>& includePaths,
jvxBool& dependencyMode, std::vector<std::string>& ifdefs, jvxSize& maxLength)
{
int cnt = 0;
bool cont = true;
Expand All @@ -20,6 +22,8 @@ void parseInput(char* argv[], int argc, std::string& inputFName, std::string& ou
outCompText = "";
outCompPrefix = "";

maxLength = JVX_SIZE_UNSELECTED;

//std::cerr << "Hallo!" << std::endl;
while(cont && (cnt < argc))
{
Expand Down Expand Up @@ -54,6 +58,22 @@ void parseInput(char* argv[], int argc, std::string& inputFName, std::string& ou
outCompPrefix = argv[cnt++];
}

}
else if(nextToken == "-maxl")
{
tmp = "";
if(cnt < argc)
{
jvxBool err = false;
maxLength = jvx_string2Size(argv[cnt], err);
if(err != false)
{
std::cout << __FUNCTION__ << ": Warning: Failed to read option <maxl> which should be followed by a number. Instead, I found <" << argv[cnt] << ">." << std::endl;
maxLength = JVX_SIZE_UNSELECTED;
}
cnt++;
}

}
else if(nextToken == "-M")
{
Expand Down Expand Up @@ -187,13 +207,14 @@ main(int argc, char** argv)
std::string inputFName;
std::vector<std::string> includePaths;
std::vector<std::string> ifdefs;
jvxSize maxLength = JVX_SIZE_UNSELECTED;

#ifdef JVX_PROP_MATLAB_OUTPUT
std::string outDir;
std::string outCptp;
std::string outCppf;

parseInput(&argv[1], argc-1, inputFName, outDir, outCptp, outCppf, includePaths, dependencyMode, ifdefs);
parseInput(&argv[1], argc-1, inputFName, outDir, outCptp, outCppf, includePaths, dependencyMode, ifdefs, maxLength);

//================================================================
// Determine the name of the file to generate source code to
Expand Down Expand Up @@ -339,7 +360,7 @@ main(int argc, char** argv)
{
#ifdef JVX_PROP_MATLAB_OUTPUT
//std::cerr << "-->" << outDir << std::endl;
textProcessor.generateCode_mat(outDir, outCptp, outCppf);
textProcessor.generateCode_mat(outDir, outCptp, outCppf, maxLength);
#else
textProcessor.generateCode_c(outFilenameH/*outFilename*/, generateLineInfo);
#endif
Expand Down
5 changes: 3 additions & 2 deletions sources/jvxExTools/jvxExPropC/src/textProcessor_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -379,10 +379,11 @@ class textProcessor_core
std::map<jvxInt32, oneAudioPluginEntry>& collectAudioPluginsIds,
std::list<oneAudioPluginEntry>& collectInvaidAudioPluginsIds);

void generateCode_mat(const std::string& outDir, std::string& Cptp, std::string& Cppf);
void generateCode_mat(const std::string& outDir, std::string& Cptp, std::string& Cppf, jvxSize numCharsParts);

void generateCode_oneElement_mat(onePropertyElement& theElm, const std::string& outDir,
std::string& Cptp, std::string& Cppf, std::string funcPrefix, std::string propPrefix);
std::string& Cptp, std::string& Cppf, std::string funcPrefix, std::string propPrefix,
jvxSize maxNumberCharacters);


// helpers:
Expand Down
44 changes: 40 additions & 4 deletions sources/jvxExTools/jvxExPropC/src/textProcessor_helpers_mat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include <fstream>
#include <sstream>

// static int cntGen = 1;

static std::string prefixListToString(std::vector<std::string> lst, std::string sep)
{
std::string ret;
Expand All @@ -17,7 +19,7 @@ static std::string prefixListToString(std::vector<std::string> lst, std::string

void
textProcessor_core::generateCode_oneElement_mat(onePropertyElement& theElm, const std::string& outDir, std::string& Cptp, std::string& Cppf,
std::string funcPrefix, std::string propPrefix)
std::string funcPrefix, std::string propPrefix, jvxSize maxNumberCharacters)
{
jvxSize j,k,l;
std::string tag;
Expand All @@ -33,7 +35,7 @@ textProcessor_core::generateCode_oneElement_mat(onePropertyElement& theElm, cons

for(l = 0; l < theElm.thePropertyGroup.thePropertyElements.size(); l++)
{
generateCode_oneElement_mat(theElm.thePropertyGroup.thePropertyElements[l], outDir, Cptp, Cppf, funcPrefix, propPrefix);
generateCode_oneElement_mat(theElm.thePropertyGroup.thePropertyElements[l], outDir, Cptp, Cppf, funcPrefix, propPrefix, maxNumberCharacters);
}
}
else
Expand Down Expand Up @@ -68,6 +70,40 @@ textProcessor_core::generateCode_oneElement_mat(onePropertyElement& theElm, cons
funcName_set = "set_" JVX_PRODUCT_CODEGEN_TAG + Cppf + "_" + tag + funcPrefix + prefix_func + theElm.thePropertySection.properties[j].name;
}

if(JVX_CHECK_SIZE_SELECTED(maxNumberCharacters))
{
jvxBool doneShorten = false;
// Remove 6 cars in the middle
if(maxNumberCharacters > 8)
{
jvxSize numCharsOrig = funcName_get.size();
jvxSize numCharsParts = (maxNumberCharacters - 6)/2;
if(numCharsOrig > maxNumberCharacters)
{
std::string fNameGetNewFirst = funcName_get.substr(0, numCharsParts);
std::string fNameGetNewSecond = funcName_get.substr(funcName_get.size() - numCharsParts);
funcName_get = fNameGetNewFirst + "_" + jvx_size2String(numCharsOrig - fNameGetNewFirst.size() - fNameGetNewSecond.size()) + "_" + fNameGetNewSecond;
doneShorten = true;
}

numCharsOrig = funcName_set.size();
numCharsParts = (maxNumberCharacters - 6)/2;
if(numCharsOrig > maxNumberCharacters)
{
std::string fNameSetNewFirst = funcName_set.substr(0, numCharsParts);
std::string fNameCut = funcName_get.substr(numCharsParts, funcName_get.size() - 2 * numCharsParts);
std::string fNameSetNewSecond = funcName_set.substr(funcName_set.size() - numCharsParts);
funcName_set = fNameSetNewFirst + "_" + jvx_size2String(numCharsOrig - fNameSetNewFirst.size() - fNameSetNewSecond.size()) + "_" + fNameSetNewSecond;
doneShorten = true;
}
}
if(doneShorten)
{
// cntGen++;
}
}


// Function to GET property
fileName = outDir + JVX_SEPARATOR_DIR + funcName_get + ".m";
//std::cout << "-XXXX-> " << fileName << "::" << tag << "::" << funcPrefix << std::endl;
Expand Down Expand Up @@ -239,12 +275,12 @@ textProcessor_core::generateCode_oneElement_mat(onePropertyElement& theElm, cons
}

void
textProcessor_core::generateCode_mat(const std::string& outDir, std::string& Cptp, std::string& Cppf)
textProcessor_core::generateCode_mat(const std::string& outDir, std::string& Cptp, std::string& Cppf, jvxSize numCharsParts)
{
int i;

for(i = 0; i < intermediateStruct.thePropertyElements.size(); i++)
{
generateCode_oneElement_mat(intermediateStruct.thePropertyElements[i], outDir, Cptp, Cppf, "", "");
generateCode_oneElement_mat(intermediateStruct.thePropertyElements[i], outDir, Cptp, Cppf, "", "", numCharsParts);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,9 @@ jvx_fft_direct_apply_arbitrary_size(jvxData* inBuf_n, jvxData* outBuf_n2p1, jvxS
jvxDspBaseErrorType
jvx_fft_direct_apply_fixed_size(jvxData* inBuf_n, jvxData* outBuf_n2p1, jvxFFTSize szFft, jvxSize n, jvxCBool outlog10);

// Rotate the time domain signal in a M2P1 complex buffer by phase modification. fftScale must contain the value 1/fftsize
jvxDspBaseErrorType jvx_fft_crotate_time(jvxDataCplx* bufIn, jvxDataCplx* bufOut, jvxData fftScale, jvxSize numValuesRotate, jvxSize idxOffsIn, jvxSize idxOffsOut, jvxSize numVals);

JVX_DSP_LIB_END

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -2845,4 +2845,31 @@ jvx_fft_direct_apply_fixed_size(jvxData* inBuf_n, jvxData* outBuf_n2p1, jvxFFTSi
inFld = NULL;
outFld = NULL;
return JVX_DSP_NO_ERROR;
}
}

jvxDspBaseErrorType
jvx_fft_crotate_time(jvxDataCplx* bufIn, jvxDataCplx* bufOut, jvxData fftScale, jvxSize numValuesRotate, jvxSize idxOffsIn, jvxSize idxOffsOut, jvxSize numVals)
{
jvxSize i;
jvxDataCplx* inPtr = bufIn + idxOffsIn;
jvxDataCplx* outPtr = bufOut + idxOffsIn;
for (i = 0; i < numVals; i++)
{
// f = numValuesRotate * [0:1 / FFTL : 1 / 2];
jvxData f = numValuesRotate * (jvxData)idxOffsIn * fftScale;
jvxData arg = 2 * M_PI * f;
jvxData rrot = cos(arg);
jvxData irot = sin(arg);

outPtr->re = inPtr->re * rrot - inPtr->im * irot;
outPtr->im = inPtr->re * irot + inPtr->im * rrot;

inPtr++;
outPtr++;
idxOffsIn++;

// 1) abs(bufIn) and abs(bufOut) should be identical
// 2) angle(bufIn) + arg should be angle(bufsOut) - but modulo pi
}
return JVX_DSP_NO_ERROR;
}

0 comments on commit c888d26

Please sign in to comment.