压缩采样频率
令
N
=
s
r
d
目
标
压
缩
频
率
、
M
=
s
r
原
频
率
、
.
[
X
]
为
对
X
四
舍
五
入
、
[
X
]
为
对
X
取
整
令N = srd目标压缩频率、M = sr原频率、.[X]为对X四舍五入、[X]为对X取整
令N=srd目标压缩频率、M=sr原频率、.[X]为对X四舍五入、[X]为对X取整
对于满帧:
n
i
=
∑
0
<
i
<
N
.
[
i
N
∗
M
]
n_i = \sum\limits_{0<i<N} .[\frac i N * M]
ni=0<i<N∑.[Ni∗M]
对于欠满帧:设不满帧总帧元素为x,则反向计算不满帧中含有多少满足条件的元素
L
e
n
g
t
h
=
[
x
M
∗
N
]
Length= [\frac x M * N]
Length=[Mx∗N]
在代码中,sr_d = N, sr = M, iterator_numb = Length
def zip_signal(sr, audio):
signal = []
sr_d = 2 # 目标压缩频率
# 压缩采样频率
for i in range(len(audio) // sr):
# 获取一帧的所有元素
frame = audio[sr*i: sr*(i+1)]
# 重新构造新的一帧元素, 根据平均分布和四舍五入进行分配索引
t = [frame[round(j / sr_d * sr)] for j in range(sr_d)]
signal += t
else:
# 获取最后一帧(不满帧)的索引
residue = len(audio) // sr * sr
# 获取最后一帧最后一个元素的索引值 注:如果没有不满帧,此值为-1
residue_index = len(audio) - residue - 1
# 根据索引值反向计算出能压缩多少个元素(向下取整) 注:若上值为-1,则此值为0,则下方t将为空帧
iterator_numb = int(residue_index / sr * sr_d + 1)
# 取出最后一帧(不满帧元素)
frame = audio[residue:]
# 重新构造新的一帧元素, 根据平均分布和四舍五入进行分配索引 与上面的原理一致
t = [frame[round(j / sr_d * sr)] for j in range(iterator_numb)]
signal += t
return signal