From a072c1f6a42fd74d3e8318f7ee221ec9ff22f792 Mon Sep 17 00:00:00 2001 From: Frederik Beimgraben Date: Sat, 11 Jan 2025 19:26:25 +0100 Subject: [PATCH] Add createSignalFromSignal --- MMS24-25.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/MMS24-25.c b/MMS24-25.c index e459a0f..3ebcef8 100644 --- a/MMS24-25.c +++ b/MMS24-25.c @@ -200,3 +200,59 @@ MMSignal *createSignal() { return signal; } + +MMSignal *createSignalFromSignal(MMSignal *pmmsIn) { + MMSignal *signal = createSignal(); + + // Initialize and copy the values (deep copy) + signal->pdValues = (double*) malloc(sizeof(double) *pmmsIn->iNumValues); + if (signal->pdValues == NULL) + _error("createSignalFromSignal: Failed to allocate memory for signal->pdValues\n"); + + for (int i = 0; i < pmmsIn->iNumValues; i++) { + signal->pdValues[i] = pmmsIn->pdValues[i]; + } + + // Copy shallow items + signal->iNumValues = pmmsIn->iNumValues; + signal->dArea = pmmsIn->dArea; + signal->dMean = pmmsIn->dMean; + signal->dStdDev = pmmsIn->dStdDev; + signal->dMedian = pmmsIn->dMedian; + + // Deep copy of Extrema + signal->pexExtrema = (Extrema*) malloc(sizeof(Extrema)); + if (signal->pexExtrema == NULL) + _error("createSignalFromSignal: Failed to allocate memory for signal->pexExtrema\n"); + + signal->pexExtrema->iGlobalMinPos = pmmsIn->pexExtrema->iGlobalMinPos; + signal->pexExtrema->iGlobalMaxPos = pmmsIn->pexExtrema->iGlobalMaxPos; + + signal->pexExtrema->pexLocalMax = (LocalExtrema*) malloc(sizeof(LocalExtrema)); + if (signal->pexExtrema->pexLocalMax == NULL) + _error("createSignalFromSignal: Failed to allocate memory for signal->pexExtrema->pexLocalMax\n"); + + signal->pexExtrema->pexLocalMax->iNumLocalExtrema = pmmsIn->pexExtrema->pexLocalMax->iNumLocalExtrema; + signal->pexExtrema->pexLocalMax->piLocalExtremaPos = (int*) malloc(sizeof(int) *pmmsIn->pexExtrema->pexLocalMax->iNumLocalExtrema); + if (signal->pexExtrema->pexLocalMax->piLocalExtremaPos == NULL) + _error("createSignalFromSignal: Failed to allocate memory for signal->pexExtrema->pexLocalMax->piLocalExtremaPos\n"); + + for (int i = 0; i < pmmsIn->pexExtrema->pexLocalMax->iNumLocalExtrema; i++) { + signal->pexExtrema->pexLocalMax->piLocalExtremaPos[i] = pmmsIn->pexExtrema->pexLocalMax->piLocalExtremaPos[i]; + } + + signal->pexExtrema->pexLocalMin = (LocalExtrema*) malloc(sizeof(LocalExtrema)); + if (signal->pexExtrema->pexLocalMin == NULL) + _error("createSignalFromSignal: Failed to allocate memory for signal->pexExtrema->pexLocalMin\n"); + + signal->pexExtrema->pexLocalMin->iNumLocalExtrema = pmmsIn->pexExtrema->pexLocalMin->iNumLocalExtrema; + signal->pexExtrema->pexLocalMin->piLocalExtremaPos = (int*) malloc(sizeof(int) *pmmsIn->pexExtrema->pexLocalMin->iNumLocalExtrema); + if (signal->pexExtrema->pexLocalMin->piLocalExtremaPos == NULL) + _error("createSignalFromSignal: Failed to allocate memory for signal->pexExtrema->pexLocalMin->piLocalExtremaPos\n"); + + for (int i = 0; i < pmmsIn->pexExtrema->pexLocalMin->iNumLocalExtrema; i++) { + signal->pexExtrema->pexLocalMin->piLocalExtremaPos[i] = pmmsIn->pexExtrema->pexLocalMin->piLocalExtremaPos[i]; + } + + return signal; +}