我正在寻找一个递归函数来减少幅度/时间图上的数据点,同时保留曲线的特征。我最初认为我只是使用循环,这里是粗略的伪代码;
void compress(长度时间,幅度范围){
检查长度时间的分辨率不高于数据返回的分辨率 如果是的话;
循环通过长度时间,获得最小和最大振幅;
如果最小和最大幅度之间的差异在幅度范围内, 存储最小值和最大值并返回;
如果没有,则划分时间长度/ 4并调用压缩(长度时间/ 4, 范围);
然而,我意识到这将非常非常缓慢。数据来自matlab,有200k个数据对,持续4秒的音频。有没有办法使用二进制堆或类似的东西,但有两个键而不是一个?
答案 0 :(得分:1)
使用线条简化方法压缩音频波等高周期时间序列是一个非常糟糕的主意。在这种情况下,windowed FFT / FCT压缩方法会获得更高的PSNR。基本上,您将信号分区(不是精确地,因为我们使用窗口函数)将信号分成小块数据,对每个块执行FFT / FCT,然后丢弃高频系数。较低频率系数的时间序列可以使用其他传统的数据压缩方法进一步压缩,但如果再次使用有损压缩方法,通常无法保证其保真度。
话虽如此,如果你仍然坚持从一开始就使用线简化方法,Ramer–Douglas–Peucker algorithm将是一个很好的起点。