You use the stats::supsmu() for smoothing and extracting the trend. Have you tried also LOWESS algorithm and benchmark your solution?