Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 压缩正弦波表_Python_Compression_Trigonometry_Run Length Encoding - Fatal编程技术网

Python 压缩正弦波表

Python 压缩正弦波表,python,compression,trigonometry,run-length-encoding,Python,Compression,Trigonometry,Run Length Encoding,我有一个包含1024个条目的大数组,其7位值的范围为14,86 这意味着存在多个具有相同值的索引范围 比如说, consider the index range 741 to 795. It maps to 14 consider the index range 721 to 740. It maps to 15 consider the index range 796 to 815. It maps to 15 我想将此映射提供给python程序,该程序将输出以下内容: if((index

我有一个包含1024个条目的大数组,其7位值的范围为14,86

这意味着存在多个具有相同值的索引范围

比如说,

consider the index range 741 to 795. It maps to 14
consider the index range 721 to 740. It maps to 15
consider the index range 796 to 815. It maps to 15
我想将此映射提供给python程序,该程序将输出以下内容:

if((index >= 741) and (index <= 795)) return 14;
if((index >= 721) and (index <= 740)) return 15;
if((index >= 796) and (index <= 815)) return 15;
groupby映射值的一些代码已经准备好了,但我很难使用成对编码表达式

以前有人做过类似的事情吗

我以两种形式上传了数据集:

通常

.

如果您不介意由于四舍五入而产生的值略有不同,我可以为您很好地压缩这些值

from math import pi, sin
interval=2*pi/1024
sinval=lambda i:int(round(sin(i*interval)*36))+50
下面是一些代码,用于实际执行您想要的操作;它与

vals = sorted((sinval(i), i) for i in range(1024))
作为测试数据。如果在第一列中有索引,则需要在for循环中切换val和index的顺序

ranges, oldval, oldidx = [[0, 0]], 0, 0
for val, index in vals:
    if not (val == oldval and index == oldidx + 1):
        ranges[-1].append(oldidx)
        ranges.append([val, index])
    oldval, oldidx = val, index
ranges[-1].append(oldidx)
ranges.pop(0)
ifs = ('if((index >= {1}) and (index <= {2})) return {0};\n'.format(val, start, end)
            for val, start, end in ranges)
print ''.join(ifs)
编辑:哎呀,我漏了一行。固定的另外,你们的乘数实际上是36而不是35,我的脑袋里一定是14,86到15,85的四舍五入

编辑2:显示如何仅存储表的四分之一

from math import pi, sin

full = 1024
half = 512
quarter = 256
mag = 72
offset = 50

interval = 2 * pi / full

def sinval(i):
    return int(round(sin(i * interval) * (mag // 2))) + offset

vals = [sinval(i) for i in range(quarter)]

def sintable(i):
    if  i >= half + quarter:
        return 2 * offset - vals[full - i - 1]
    elif  i >= half:
        return 2 * offset - vals[i - half]
    elif i >= quarter:
        return vals[half - i - 1]
    else:
        return vals[i]

for i in range(full):
    assert -1 <= sinval(i) - sintable(i) <= 1
如果从表中减去偏移量,只需使用前两个-vals[…]


此外,底部的比较是模糊的,因为我得到了72分之一的错误。这仅仅是因为您的值被舍入为整数;它们都是介于两个值之间的位置,所以精度几乎没有下降。

结束后,我终于找到了这个解决方案

注意:使用类似正弦的周期fn,您只需存储四分之一,即256个值或表的一半,然后在查找时对索引执行一些定点运算即可。正如我所评论的,如果你进一步不存储+50的偏移量,你需要少一点,代价是在查找时间之后加上一个整数。因此,79%的压缩很容易实现。RLE会给你更多。即使fn有噪声,您仍然可以使用这种通用方法获得适当的压缩

正如agf所指出的,比如说,你的fn=50+36*sin72*pi*n/1024=50+gn

因此,将gn=36*sin72*pi*n/1024的256个值制成表格,仅适用于范围n=0..255

然后,fn可通过以下公式轻松计算:

if 0 <= n < 256, f(n) = 50 + g(n)
if 256 <= n < 512, f(n) = 50 + g(511-n)
if 512 <= n < 768, f(n) = 50 - g(n-512)
if 768 <= n < 1024, f(n) = 50 - g(1023-n)

注意,在agf改变方法之前,我开始了桌上压缩机方法。。。正在尝试获得itertools或列表理解解决方案

这将在8位8051内核上运行。然而,我想知道你是如何推导常数的!85-15/2=35,表格从50开始到结束。。。我看一下,马上回答你的问题。我很感激!得到答案后,将上面公式的输出与我上传的表格进行比较:数值会有一些变化。因此,我建议您使用我上传的表格进行测试。答案很好。另一方面,这看起来不像是压缩波形表的好方法,是吗:-这里是如何只存储四分之一的波形表。这将在8位8051内核上工作。我必须说,这是一次非常糟糕的表格压缩尝试。如果有人能建议一种更好的混合RLE和增量编码的方法?如果能够以与数组查找相当的性能压缩数据集,我们将不胜感激!对于228..255,RLE编码可以进一步压缩gn=36;对于208..227,可以进一步压缩35;对于195..207,可以进一步压缩34;对于183..194,可以进一步压缩33;对于173..182,可以进一步压缩32;对于164..172,可以进一步压缩31;对于156..163,可以进一步压缩30。取决于表大小和代码大小之间的权衡。在极端情况下,您可以使用压缩表实现完整的二进制搜索。CORDIC将处理周期性FN,他说,他还添加了模拟噪声。将fn和噪声分别制成表格可能会更紧凑。在我们知道之前,他需要给我们看数据-我添加了只存储表的四分之一的算法。干得好。您的解决方案在功能上是相同的。我知道利用波对称性的方法,但该表也可能用于保存一些不对称样本,包括模拟噪声。然而,对之间的偏差不会移动超过3-4位LSB。否则,如果我只对一个正弦函数感兴趣,那么使用一点LUT的多项式插值就可以工作了。@PoorLuzer,然后可能会将高位和低位分别制表。给我们看一些实际的样本噪声数据?你想要什么样的数据紧凑性与代码的折衷?给出例子让人们想到细节,但是考虑DTMF波表。不要想一个音调的细节是两个正弦的总和,而是在一个抽象级别上考虑一个数字=1个唯一波形。对于噪声,请考虑声音hi的wav编码。对于256-511和768-1023,您将禁用1。
#import itertools

table_="""
    0       50
    1       50
    ...
    1021    49
    1022    50
    1023    50""".split()

# Convert values to int. Throw away the indices - will recover them with enumerate()
table = [int(x) for x in table_[1::2]]

compressed_table = []
istart = 0
for i,v in enumerate(table):
    if v != table[i-1]:
        iend = i-1
        compressed_table.append((istart,iend,table[i-1]))
        istart = i
    else:
        continue # skip identical values
# Slightly ugly: append the last value, when the iterator was exhausted
compressed_table.append((istart,i,table[i]))