Понабирал статистику для 1-битного сжатия 22050 Гц - вот песенка What If:
Code: Select all
ONEBIT STAT:
[1]=116894 (2.04%)
[2]=88834 (3.09%)
[3]=60692 (3.17%)
[4]=44493 (3.10%)
[5]=29798 (2.59%)
[6]=21371 (2.23%)
[7]=17700 (2.16%)
[8]=15879 (2.21%)
[9]=14122 (2.21%)
[10]=11584 (2.02%)
[11]=9327 (1.79%)
[12]=7835 (1.64%)
[13]=6565 (1.49%)
[14]=5947 (1.45%)
[15]=5877 (1.54%)
[16]=5268 (1.47%)
[17]=4411 (1.31%)
[18]=3847 (1.21%)
[19]=3454 (1.14%)
[20]=3305 (1.15%)
[21]=3166 (1.16%)
[22]=2839 (1.09%)
[23]=2598 (1.04%)
[24]=2272 (0.95%)
[25]=2050 (0.89%)
[26]=2055 (0.93%)
[27]=2090 (0.98%)
[28]=1844 (0.90%)
[29]=1874 (0.95%)
[30]=1790 (0.94%)
[31]=1741 (0.94%)
[32]=1620 (0.90%)
[33]=1339 (0.77%)
[34]=1217 (0.72%)
[35]=1258 (0.77%)
[36]=1227 (0.77%)
[37]=1056 (0.68%)
[38]=1113 (0.74%)
[39]=982 (0.67%)
[40]=1002 (0.70%)
[41]=956 (0.68%)
[42]=853 (0.62%)
[43]=803 (0.60%)
[44]=741 (0.57%)
[45]=676 (0.53%)
[46]=681 (0.55%)
[47]=628 (0.51%)
[48]=714 (0.60%)
[49]=627 (0.53%)
[50]=611 (0.53%)
[51]=535 (0.48%)
[52]=492 (0.45%)
[53]=533 (0.49%)
[54]=550 (0.52%)
[55]=440 (0.42%)
[56]=400 (0.39%)
[57]=386 (0.38%)
[58]=375 (0.38%)
[59]=371 (0.38%)
[60]=380 (0.40%)
[61]=405 (0.43%)
[62]=353 (0.38%)
[63]=350 (0.38%)
[64]=394 (0.44%)
[65]=377 (0.43%)
[66]=324 (0.37%)
[67]=280 (0.33%)
[68]=263 (0.31%)
[69]=250 (0.30%)
[70]=271 (0.33%)
[71]=291 (0.36%)
[72]=308 (0.39%)
[73]=292 (0.37%)
[74]=268 (0.35%)
[75]=253 (0.33%)
[76]=236 (0.31%)
[77]=249 (0.33%)
[78]=250 (0.34%)
[79]=199 (0.27%)
[80]=222 (0.31%)
[81]=253 (0.36%)
[82]=234 (0.33%)
[83]=210 (0.30%)
[84]=209 (0.31%)
[85]=190 (0.28%)
[86]=207 (0.31%)
[87]=192 (0.29%)
[88]=192 (0.29%)
[89]=157 (0.24%)
[90]=142 (0.22%)
[91]=119 (0.19%)
[92]=148 (0.24%)
[93]=148 (0.24%)
[94]=144 (0.24%)
[95]=149 (0.25%)
[96]=121 (0.20%)
[97]=134 (0.23%)
[98]=182 (0.31%)
[99]=175 (0.30%)
[100]=129 (0.22%)
[101]=125 (0.22%)
[102]=128 (0.23%)
[103]=140 (0.25%)
[104]=116 (0.21%)
[105]=135 (0.25%)
[106]=129 (0.24%)
[107]=158 (0.29%)
[108]=137 (0.26%)
[109]=143 (0.27%)
[110]=132 (0.25%)
[111]=117 (0.23%)
[112]=128 (0.25%)
[113]=108 (0.21%)
[114]=104 (0.21%)
[115]=124 (0.25%)
[116]=122 (0.25%)
[117]=126 (0.26%)
[118]=114 (0.23%)
[119]=109 (0.23%)
[120]=135 (0.28%)
[121]=112 (0.24%)
[122]=105 (0.22%)
[123]=117 (0.25%)
[124]=102 (0.22%)
[125]=122 (0.27%)
[126]=99 (0.22%)
[127]=106 (0.23%)
[128]=102 (0.23%)
[129]=123 (0.28%)
[130]=123 (0.28%)
[131]=156 (0.36%)
[132]=111 (0.26%)
[133]=93 (0.22%)
[134]=78 (0.18%)
[135]=58 (0.14%)
[136]=61 (0.14%)
[137]=58 (0.14%)
[138]=63 (0.15%)
[139]=79 (0.19%)
[140]=57 (0.14%)
[141]=68 (0.17%)
[142]=65 (0.16%)
[143]=59 (0.15%)
[144]=71 (0.18%)
[145]=78 (0.20%)
[146]=80 (0.20%)
[147]=77 (0.20%)
[148]=74 (0.19%)
[149]=68 (0.18%)
[150]=73 (0.19%)
[151]=52 (0.14%)
[152]=54 (0.14%)
[153]=56 (0.15%)
[154]=68 (0.18%)
[155]=65 (0.18%)
[156]=62 (0.17%)
[157]=68 (0.19%)
[158]=49 (0.13%)
[159]=56 (0.16%)
[160]=44 (0.12%)
[161]=53 (0.15%)
[162]=42 (0.12%)
[163]=50 (0.14%)
[164]=55 (0.16%)
[165]=42 (0.12%)
[166]=47 (0.14%)
[167]=52 (0.15%)
[168]=36 (0.11%)
[169]=30 (0.09%)
[170]=32 (0.09%)
[171]=20 (0.06%)
[172]=31 (0.09%)
[173]=34 (0.10%)
[174]=33 (0.10%)
[175]=38 (0.12%)
[176]=23 (0.07%)
[177]=27 (0.08%)
[178]=19 (0.06%)
[179]=16 (0.05%)
[180]=16 (0.05%)
[181]=25 (0.08%)
[182]=17 (0.05%)
[183]=13 (0.04%)
[184]=16 (0.05%)
[185]=21 (0.07%)
[186]=21 (0.07%)
[187]=15 (0.05%)
[188]=10 (0.03%)
[189]=10 (0.03%)
[190]=13 (0.04%)
[191]=13 (0.04%)
[192]=12 (0.04%)
[193]=12 (0.04%)
[194]=17 (0.06%)
[195]=18 (0.06%)
[196]=15 (0.05%)
[197]=7 (0.02%)
[198]=19 (0.07%)
[199]=19 (0.07%)
[200]=14 (0.05%)
...
Это по длительностям неизменных состояний 0 или 1
А вот статистика пар (когда идёт сначала много единиц, а потом много нулей, и наоборот - в количестве до 13):
Code: Select all
PAIRSTAT:
[1] 24393 39670 24014 19754 14447 10054 *7410 *5732 *5245 *4661 *3850 *3592 *3027
[2] 0 14541 20545 16715 10914 *6685 *4865 *4302 *3847 *3399 *2858 *2374 *1742
[3] 0 0 8304 11957 *6943 *4325 *3712 *3311 *2894 *2478 *1902 *1376 *1233
[4] 0 0 0 *3774 *4360 *3341 *2800 *2438 *2192 *1598 *1191 *980 *930
[5] 0 0 0 0 *1446 *2089 *1869 *1639 *1465 *1110 *867 *790 *682
[6] 0 0 0 0 0 *898 *1642 *1375 *1098 *851 *720 *616 *548
[7] 0 0 0 0 0 0 *650 *1249 *1105 *828 *753 *631 *476
[8] 0 0 0 0 0 0 0 *604 *1237 *995 *771 *597 *488
[9] 0 0 0 0 0 0 0 0 *599 *919 *621 *485 *445
[10] 0 0 0 0 0 0 0 0 0 *333 *563 *441 *350
[11] 0 0 0 0 0 0 0 0 0 0 *213 *384 *291
[12] 0 0 0 0 0 0 0 0 0 0 0 *154 *231
[13] 0 0 0 0 0 0 0 0 0 0 0 0 *76
1) [1,7] 7410 <
2) [3,5] 6943 <
3) [2,6] 6685 <
4) [1,8] 5732 <
5) [1,9] 5245 <
6) [2,7] 4865 <
7) [1,10] 4661 <
8) [4,5] 4360 <
9) [3,6] 4325 <
10) [2,8] 4302 <
11) [1,11] 3850 <
12) [2,9] 3847 <
13) [4,4] 3774 <
14) [3,7] 3712 <
15) [1,12] 3592 <
16) [2,10] 3399 <
17) [4,6] 3341
18) [3,8] 3311
19) [1,13] 3027
20) [3,9] 2894
Это я хочу наиболее частые пары (общая сумма длительностей которых больше 7 сэмплов) одним байтом кодировать - будет полбайта на длительность:
Команда
01xnnnnb где x будет означать при 1 большее вперёд, меньшее назад, а при 0 меньшее вперёд, большее назад, и nnnn кодировать например так (пометил сверху значками < те пары, что выбрал):
Code: Select all
0000 - 1,7
0001 - 1,8
0010 - 1,9
0011 - 1,10
0100 - 1,11
0101 - 1,12
0110 - 2,6
0111 - 2,7
1000 - 2,8
1001 - 2,9
1010 - 2,10
1011 - 3,5
1100 - 3,6
1101 - 3,7
1110 - 4,4
1111 - 4,5
т.е. например кодирование "0000 - 1,7" будет иметь 4 варианта использования:
- 01000001 будет означать 1 раз "1" и затем 7 раз "0"
- 01000000 будет означать 1 раз "0" и затем 7 раз "1"
- 01100000 будет означать 7 раз "0" и затем 1 раз "1"
- 01100001 будет означать 7 раз "1" и затем 1 раз "0"
А остальные команды будут как описано выше:
1gfedcba - вывести подряд биты a,b,c,d,e,f,g
00nnnnnb - повторить b nnnnn+7 раз (т.е. от 8 до 38)
0000000x - конец стрима (это как бы предыдущая команда при nnnnn=0)
P.S. Это должно быть компактнее, чем просто повторения до 70 кодировать одним байтом:
Code: Select all
...
[39]=982 (0.67%)
[40]=1002 (0.70%)
[41]=956 (0.68%)
[42]=853 (0.62%)
[43]=803 (0.60%)
[44]=741 (0.57%)
[45]=676 (0.53%)
[46]=681 (0.55%)
[47]=628 (0.51%)
[48]=714 (0.60%)
[49]=627 (0.53%)
[50]=611 (0.53%)
[51]=535 (0.48%)
[52]=492 (0.45%)
[53]=533 (0.49%)
[54]=550 (0.52%)
[55]=440 (0.42%)
[56]=400 (0.39%)
[57]=386 (0.38%)
[58]=375 (0.38%)
[59]=371 (0.38%)
[60]=380 (0.40%)
[61]=405 (0.43%)
[62]=353 (0.38%)
[63]=350 (0.38%)
[64]=394 (0.44%)
[65]=377 (0.43%)
[66]=324 (0.37%)
[67]=280 (0.33%)
[68]=263 (0.31%)
[69]=250 (0.30%)
[70]=271 (0.33%)
...
Как минимум чисто статистически на примере этой конкретной песенки:
Screenshot from 2024-09-17 18-49-42.png
т.е. теперь длительности от 39 до 70 будут представляться 2 байтами, а не одним, что выльется в дополнительные 17003 байтов, а кодирование пар займёт 76702 байта вместо ориентировочных 152 тысяч (когда каждая половинка пары будет кодироваться отдельным байтом либо будет частью 7-битной посылки), т.е. мы так экономим почти 60 килобайт...
P.P.S. Покрытие парных длительностей получается следующее (с учётом перестановки местами):
Code: Select all
x= 1 2 3 4 5 6 7 8 9 10 11 12 13
[1,x] * * * * * *
[2,x] * * * * *
[3,x] * * *
[4,x] * *
[5,x] * *
[6,x] * *
[7,x] * * *
[8,x] * *
[9,x] * *
[10,x] * *
[11,x] *
[12,x] *
[13,x]
Тут получается вариант [4,4] при перестановке также выдаёт [4,4] т.е. можно эту вторую комбинацию отдать под что-то другое - например 0111110b будет маркером конца стрима (с выводом последнего отсчёта b), а 0000000x отдать полностью под кодирование длительностей (т.е. вместо nnnnn+7 сделать nnnnn+8 покрывая длительности от 8 до 39)?
P.P.P.S. Либо отдать второй код [4,4] под одну из следующих по частоте комбинаций, например [13,1] - при этом правда потеряется симметричность покрытия, но зато покроется больше вариантов ... ну или [5,5] для симметричности...
P.P.P.P.S. А может быть вообще сделать адаптивное кодирование? У разных звуковых файлов разное распределение пар и во многих случаях ещё есть непокрытые пары, которых больше, чем повторений на 38 или 37 отсчётов например - т.е. получается выгоднее отдать конец диапазона повторений в команде 00nnnnnb тоже под пары - а вот насколько отдать это надо смотреть для каждого конкретного файла...
You do not have the required permissions to view the files attached to this post.