Comparem el timestamp i el temps suposant la presa de mostres uniforme

library (zoo)
## 
## S'està adjuntant el paquet: 'zoo'
## Els següents objectes estan emmascarats des de 'package:base':
## 
##     as.Date, as.Date.numeric
library(plotly)
## S'està carregant el paquet requerit: ggplot2
## 
## S'està adjuntant el paquet: 'plotly'
## L'objecte següent està emmascarat per 'package:ggplot2':
## 
##     last_plot
## L'objecte següent està emmascarat per 'package:stats':
## 
##     filter
## L'objecte següent està emmascarat per 'package:graphics':
## 
##     layout
library(signal)
## Warning: el paquet 'signal' es va construir amb la versió d'R 4.4.3
## 
## S'està adjuntant el paquet: 'signal'
## L'objecte següent està emmascarat per 'package:plotly':
## 
##     filter
## Els següents objectes estan emmascarats des de 'package:stats':
## 
##     filter, poly
lowpass <- function(x, fs, f_c) {
  # Normalize cutoff frequency to Nyquist frequency
  wpass <- f_c / (fs / 2)
  
  # 4th order Butterworth lowpass filter
  bf <- butter(4, wpass, type = "low")
  
  # Zero-phase filtering (like MATLAB's lowpass)
  y <- filtfilt(bf, x)
  
  return(y)
}

# filtre modificat repetint mediana dels primers i els darrers
lowpassmodif <- function(x, fs, f_c, extra=100) {
  # Normalize cutoff frequency to Nyquist frequency
  wpass <- f_c / (fs / 2)
  
  # 4th order Butterworth lowpass filter
  bf <- butter(4, wpass, type = "low")
  
  long <- length(x)
  x_ampliat <- c(rep(median(head(x,20)), extra), x, rep(median(tail(x,20)), extra))
  
  # Zero-phase filtering (like MATLAB's lowpass)
  y_ampliat <- filtfilt(bf, x_ampliat)
  
  y <- y_ampliat[(extra+1):(long+extra)]
  
  return(y)
}
ruta0 <- "~/pere\\producte\\workflowShiny" #ruta on tingueu els fitxers
ruta1 <- c("mesures_23_abril", "mesures_30_abril_netes", "Mesures_06052025")

dir(file.path(ruta0, ruta1[3]))
##  [1] "Parametres mostres analitzades_06_05_2025.xlsx"    
##  [2] "retorn_6maig2025.RData"                            
##  [3] "serial_log_20250505_093944_EscumaVerda.csv"        
##  [4] "serial_log_20250505_094314_EscumaVerda.csv"        
##  [5] "serial_log_20250505_095151_EscumaVerda.csv"        
##  [6] "serial_log_20250505_095611_EscumaNegra.csv"        
##  [7] "serial_log_20250505_100304_Farina90.csv"           
##  [8] "serial_log_20250505_100535_Farina90.csv"           
##  [9] "serial_log_20250505_100811_Farina90.csv"           
## [10] "serial_log_20250505_101033_Farina90.csv"           
## [11] "serial_log_20250505_101223_EscumaBlanca.csv"       
## [12] "serial_log_20250505_101505_Farina262.csv"          
## [13] "serial_log_20250505_102028_Farina262.csv"          
## [14] "serial_log_20250505_102251_Farina262.csv"          
## [15] "serial_log_20250505_102500_Farina262.csv"          
## [16] "serial_log_20250505_102823_EscumaBlancaPont.csv"   
## [17] "serial_log_20250505_103033_SoftDoughGroga.csv"     
## [18] "serial_log_20250505_103240_Farina400.csv"          
## [19] "serial_log_20250505_103438_Farina400.csv"          
## [20] "serial_log_20250505_103713_Farina400.csv"          
## [21] "serial_log_20250505_103908_Farina400.csv"          
## [22] "serial_log_20250505_104111_Farina400.csv"          
## [23] "serial_log_20250505_104412_EscumaNegra.csv"        
## [24] "serial_log_20250505_104827_Fusta.csv"              
## [25] "serial_log_20250505_105223_SorraQuinetica.csv"     
## [26] "serial_log_20250505_105521_PastaModelarBlanca.csv" 
## [27] "serial_log_20250505_105715_PastaModelarBlanca.csv" 
## [28] "serial_log_20250505_110020_Farina461.csv"          
## [29] "serial_log_20250505_110244_Farina461.csv"          
## [30] "serial_log_20250505_110539_SoftDoughBlanca.csv"    
## [31] "serial_log_20250505_112040_Farina119Fallit.csv"    
## [32] "serial_log_20250505_112229_Farina119.csv"          
## [33] "serial_log_20250505_112432_Farina119.csv"          
## [34] "serial_log_20250505_113019_PastaFlexibleXinesa.csv"
diradf <- function(ruta=file.path(ruta0, ruta1), ruta0=NULL, ruta1=NULL) {
  fitxers <- dir(file.path(ruta))
  arrel <- if (is.null(ruta1)) ruta else ruta1
  return(data.frame(carpeta=arrel, fitxer=fitxers))
}

fitxers <- do.call(rbind, lapply(ruta1, function(x) diradf(ruta1=x, ruta0=ruta0)))
fitxers <- fitxers[grepl("\\.csv$",fitxers$fitxer),]
l <- htmltools::tagList()
for (i in 1:nrow(fitxers)) {
  fitxer <- fitxers$fitxer[i]
  ruta <- file.path(ruta0, fitxers$carpeta[i])
  sensorLog <- read.table(file.path(ruta, fitxer), quote="\"", comment.char="")
  names(sensorLog) <- c("y_temp_g", "y_ax", "y_ay", "y_az", "y_gx", "y_gy", "y_gz", "y_force", "y_temp", "time(ms)")
  sensorLog$t_unif <- (1:nrow(sensorLog))*20
  sensorLog$timestamp_red <- sensorLog$`time(ms)` - min(sensorLog$`time(ms)` )
  fig <- plot_ly(sensorLog, x = ~t_unif, y = ~(timestamp_red-t_unif), type = 'scatter', mode = 'lines', name="timestamp - t_uniforme") 
  fig <- fig %>% add_trace(y = ~y_force, name = 'força', mode = 'lines', type="scatter") 
  fig <- fig %>% add_trace(y = ~y_ax, name = 'acceleració_x', mode = 'lines', type="scatter") 
  fig <- fig %>% add_trace(y = ~y_ay, name = 'acceleració_y', mode = 'lines', type="scatter") 
  fig <- fig %>% layout(title = fitxer)
  l[[i]] <- as_widget(fig)
}
l