トップページ⇒tech
67コメント20KB

♪WAVの可逆圧縮アルゴリズム

■ このスレッドは過去ログ倉庫に格納されています
0001かんせいNGNG
WAVファイルを効率よく可逆圧縮するにはどうしたらいいんでしょうか?
よくあるのは、差分とってハフマン圧縮だと思いますが、
もっと圧縮率を上げられないのでしょうか。

いい方法を知っていたり、アイディアがあったら教えてください。
0002名無しさん@お腹いっぱい。 NGNG
昔そういうソフトがあったが、
仕組みはしらん。
0003名無しさん@お腹いっぱい。NGNG
可逆でも半分くらいまでは縮まるらしい。
0004かんせいNGNG
差分ハフマンで50%〜70%にはなりました。
静かなインスト曲は高圧縮率になりますが、
うるさいハードロックはあまり圧縮できません。
それ以上、圧縮する方法は無いのでしょうか。
0005デフォルトの名無しさんNGNG
他に効率の良い非可逆圧縮を使って源信号との差分を可逆圧縮する方法
が考えられます。
差分の圧縮方法としては、算術圧縮が一番効率よさそうだけど、
算術圧縮は特許でがんじがらめです。利用するなら要調査

非可逆圧縮の多くは
 コサイン変換を使う
 予測係数を使う
のどちらか又は両方ですね
0006名無しさん@お腹いっぱい。NGNG
差分じゃなくて、加速度じゃだめなん?
0007SAGENGNG
>効率の良い非可逆圧縮を使って源信号との差分を可逆圧縮

 Wavelet + RangeCoder 辺りでど〜よ。
0008かんせいNGNG
>5

以前、「原音wav」と「mp3をデコードしたwav」の差分をハフマンで圧縮してみました。
結果は失敗でした。mp3は高音がかなり原音と違うので、
差分は高音が強く音量も大きくなってしまいどうしようもありません。

>6

加速度って、原波形の2階微分(差分)のことですか?
これも以前、実験しました。
高音があまり含まれていない曲では、単なる差分より高圧縮率になりました。
0009デフォルトの名無しさんNGNG
>>6
差分でも元の語長に収まらないけど、差分の場合はキャリーを
含めた処理をする事が可能です。が、2階差分だと・・・
また、差分を取って圧縮出来ない信号とは高周波成分が多い訳で、
さらにその差を取って処理するのはあまり効率的になりません。
0010デフォルトの名無しさんNGNG
そういえば高圧縮系は位相をあまり保存しないから駄目かもね

単純な線形予測係数と残差はどうでした?
0011かんせいNGNG
>9

もちろん、差分を取ると1サンプルあたりのビット数が1ビット増加します。
16ビットPCMの差分をとると、17ビット必要になり、もう一回差分をとると18ビットです。
それが入りきるデータ型計算を行い、ハフマン圧縮をしたら可逆圧縮になりました。

問題は、高周波成分が多い場合です。
何か良い方法は無いでしょうか。

>10

単純な線形予測って2階微分と同じでは?
勘違いでしたらごめんなさい。

それと、ハフマンを使うことにも疑問を感じています。
圧縮されたデータの他に、Tree情報も圧縮ファイルに
含めなければならないからです。
音量の大きい16bitのwavデータでは、
Treeが数十KBにもなってしまいます。
0012名無しさん@お腹いっぱい。NGNG
ストリームを0.01秒ぐらいを1ブロックとした、ブロックの列とみなす。

ストリームの各ブロックBについて
既にエンコードしたブロックの中から差分の絶対値和最小となる
参照ブロックRを探す。このRとBの差分を差分ブロックDとする。

参照ブロック番号Rの列はスライド辞書圧縮する。
差分ブロックDの各値は正規分布するものと仮定して、分散を計算して、
この分散に基づく正規分布の確率モデルに適合するハフマン符号表で
静的ハフマン符号化圧縮する。

ってな風にしたら、だめ?
素人なので、へんなこといってるかも。
0013名無しさん@お腹いっぱい。NGNG
MonkeysAudioとかPerfect Clarity Audioとかいろいろありますね。
0014名無しさん || dieNGNG
>>12
ブロックが離れると差分が大きくなる確率が高くなるんじゃない?
音声は急激な変化よりも連続的な変化が多いから
ADPCMが結構圧縮効いてるんだろうし。
圧縮対象の性質を考慮した圧縮法じゃないと。
AメロとAメロ’の差分とってAメロ*2+差分と表せられたらいいのにねえ。
ってMIDIじゃあるまいし。
0015デフォルトの名無しさんNGNG
>単純な線形予測って2階微分と同じでは?
単純な線形予測とは、LPCやPARCORの事です
つまりフィルタですね。
そのフィルタの逆フィルタを計算し、元の信号に逆フィルタをかけて
その残差を記録します。残差+フィルタで元の信号が出てくる仕掛けです。
ただ、この方法はノイズにはあまり効果がありません
(もちろんノイズに十分な可逆圧縮が出来るなんて言うのは山師だけですが)

ハフマンについてはあらかじめ表を定めておくのが一番良いのでは?
あるいは、分布の度合いによって10通りくらい決めておくとか
算術圧縮ならそれこそ分散だけを記録する方法で十分でしょう
(ただこれらは特許でがんじがらめ)
0016かんせいNGNG
>12

面白い案をありがとうございます。
直感的にそのままでは、うまくいかなそうな気がしますが、
非圧縮ファイルが大きいほど、よく近似できる参照ブロックRが
見つかりやすくなり、高圧縮率になりそうです。

>15

なるほど。ありがとうございます。やってみます。
0017デフォルトの名無しさんNGNG
ウエブレットでパラメトリック分析して残差圧縮というのも
0018名無しさん@お腹いっぱい。NGNG
http://www.csdinc.co.jp/archiver/
この辺、利用させて貰うとかだめ?
外していたらごめんなさい。
0019名無しさん@お腹いっぱい。NGNG
データを16ビットとし、すべてのレジスタも16bitとします

レジスタは、X0〜Xn a1〜an Y
元データを順に並べて 現在X0 ひとつ前 X1 ...Xn と Xレジスタに記録

【圧縮】
X0 = Yi + (a1*X1 + a2*X2 + . . . + an*Xn)/2^16
となるように Yiを定めます。

係数 a1, . . . ,an
適当な期間ごとにΣ|Yi^2|が最も小さくなるようにanを定めます。
そしてYi列とanをそのスパン事に圧縮し記録します。

【再生】記録スパン事に a1〜anを設定してはYiから上の式でX0を求め
 Xレジスタを回転させながら再生します
0020かんせいNGNG
>17

パラメトリック分析って何ですか?

>19

なるほど。参考になります。

たくさんのアイディアをいただき皆さんありがとうございます。
仕事が忙しいので、正月休みにでもそれぞれの方法を
テストしてみたいと思います。
0021デフォルトの名無しさんNGNG
パラメトリック分析っていうのは
分析においてモデルを指定するという意味です
0022かんせいNGNG
こんなの見つけました。

http://www.compressconsult.com/rangecoder/

エントロピー圧縮の一種のようですが、
ハフマンや算術圧縮とは違うようです。

圧縮ツールCGAに使われているようです。
http://www1.odn.ne.jp/synsyr/

私は、英語が苦手なのでまだほとんど理解出来ていません。
概要が分かる人いませんか?
説明していただけると助かります。
日本語で解説しているサイトでも構いません。
0023デフォルトの名無しさんNGNG
結論!
かんせい君より分かる人はここには居ない.
0024デフォルトの名無しさんNGNG
面白そうですね。調べてみます。
私の方はブロックソート法というのを調べています
こっちは日本語があるので
http://www.sr3.t.u-tokyo.ac.jp/~nishim/block_sort.html
http://www.hn.is.uec.ac.jp/~arimura/dissertation-j.html
0025かんせいNGNG
ブロックソートも気になりますね。
私も調べてみます。
0026デフォルトの名無しさんNGNG
まあどっちにしてもエントロピー符号化の前処理でどれだけ
下げられるかって所にかかってるでしょう
00277NGNG
RangeCoder / BWT の日本語解説…
 http://member.nifty.ne.jp/DO/
算術符号化と同じで、エントロピー圧縮の理論上の最高値を出せる(はず)の符号化です。

ちなみに、こういう音声に特化してない一般的な圧縮法でいいなら
今のところ最強は PPM 系のアルゴリズムかと。
0028名無しさん@お腹いっぱい。NGNG
>>27
このページ作ってる奴すごいな。
多分俺より頭いい。
俺:22歳
0029>28NGNG
自分が平均より頭がいいって思ってたの?ププ
0030名無しさん@お腹いっぱい。NGNG
なんかここに書き込んでる人、みんなすごいけど音声に関連したいい書籍
知りませんか?教えてください。

#いっておきますが28じゃないです(w
0031デフォルトの名無しさんNGNG
>>30
やりたい事によりますよ。 というかそんなに良い本はありません
0032名無しさんNGNG
とりあえず「やりなおしの工業数学」って本を買ってきました(w
0033デフォルトの名無しさんNGNG
>>27 のプロフィール、
>情報理論については、中学2年頃からはまり、特にデータ圧縮である
>LZ法、BlockSorting法、PPM法、その他様々な方法を一通りやってきている。
若気の至りと言う奴なんだろうかな
0034デフォルトの名無しさんNGNG
29のツッコミってなんか変じゃないか?
0035>28NGNG
俺には至って普通のプログラムに興味ある高校生にしか見えないが?
0036デフォルトの名無しさんNGNG
俺も高校の頃は画像圧縮アルゴリズムを色々とやってたな。
実は圧縮アルゴリズムってやってる奴結構多くないか?
0037デフォルトの名無しさんNGNG
自力で考え出すのは難しく、しかし追いかけるのは案外簡単で
しかも結構面白いのが圧縮だね
0038名無しさんNGNG
高校生でDB接続なんてやってたらへんだろ
0039便乗さんNGNG
すいません,便乗なんですけど,
wavファイルをtxt形式に変換(その逆も)する方法か,
ソフトがありましたら教えていただけないでしょうか?
おねがいします
0040>39NGNG
BASE64 , ISH
「wav形式をtxt形式に変換」と言うより
「BinaryをTextに変換」と言った方が正しくないかい?
0041デフォルトの名無しさんNGNG
ブロックソーティングはWAVには向かない気がするがどうよ?
0042>41NGNG
前処理して単純差分とか 予測係数残差とかを圧縮するという話でしょう
0043>39NGNG
サウンドカード2枚差してViaVoice
0044デフォルトの名無しさんNGNG
dump.exe使えや。
0045名無しさん@お腹いっぱい。NGNG
dump - ext2 filesystem backup
0046うぉろNGNG
遮断周波数や許容リプル等を入力するだけで、
IIRの伝達関数が出てくる、IIRの設計ツール知りませんか?
FIRならいっぱいあるんだけど…
0047デフォルトの名無しさんNGNG
http://momiji.i.ishikawa-nct.ac.jp/
0048sageNGNG
フーリエ変換してMIDI形式で保存
004948NGNG
しまった
0050デフォルトの名無しさんNGNG
>>48 うん板井さんだね。 >フーリエ変換してMIDI形式で保存
0051デフォルトの名無しさんNGNG
>>41
ブロックソーティングやってみたよ。単純には適用できないね。
波形毎にソートして、差分をとったらどうだろう?
0052デフォルトの名無しさんNGNG
Plzというwavの圧縮方法もある。
ソースもついてたような気がするんで探してみては?
0053デフォルトの名無しさんNGNG
>>18
戸田さん?
0054デフォルトの名無しさんNGNG
>>52
plz可逆じゃないよ。
アフィン変換のパラメータを保存する方式。
でも方針としては、使えそう。1波形を基本にする
のだと思うな。
0055兄ヲタNGNG
最近は「外してたらごめんなさい」って言うとみんな戸田さんに
なるのか。戸田恵子マンセ〜
(アンパンマンじゃなくてカララとかマチルダとかキャッツアイの瞳とか
洋画の吹き替えの声ね。ダンナと知り合ったのは「地球へ・・・」の時ですか?)
0056デフォルトの名無しさんNGNG
TOWNSの戸田さんかと思った
0057名無しサンプリング@48kHzNGNG
>>48

めっちゃ非可逆じゃん。
0058板井さんNGNG
>>57 (藁
圧縮というよりは、採譜であろう。

非可逆の話題は別スレを立てたほうが良いのかな。あと、画像とか動画とか。
0059デフォルトの名無しさんNGNG
http://salad.2ch.net/test/read.cgi?bbs=software&key=982384176
なんかもめてるね
0060名無しNGNG
KLTの解説ないすか?
0061デフォルトの名無しさんNGNG
空間コヒーレンスでは画像ほどではないけど強い訳だから、
256バイト単位でDCT変換して2二元ハフマン圧縮したら結構な
圧縮になるのでは?算術を実数ではなくて整数近似計算させれば
可逆になるだろうし。
0062デフォルトの名無しさんNGNG
>>59
そこの住人、煽るんだったらちゃんと煽ればいいのに(藁)
0063デフォルトの名無しさんNGNG
>61 256バイト単位という事は 64サンプル毎にDCTするって事?

やってみたら判るけど・・・・ やってみたら?
0064デフォルトの名無しさんNGNG
64サンプル単位ってのが何の事かと思ったら
ステレオ16ビットなら4バイト=1サンプルって事なんだね

64サンプルDCTをすると結果は 元のデータよりも6bit以上余分に必要になる
ハフマン圧縮程度じゃ、可逆圧縮の場合は逆にデータが増える可能性大
0065デフォルトの名無しさんNGNG
>>64 DCTやFFTしても情報量は変わらないのでは?
0066デフォルトの名無しさんNGNG
>>65
計算誤差をなくすために必要な情報量が増える、といえば解り易いかねえ
0067デフォルトの名無しさんNGNG
例えば、2点のDCTは 和と差を求める事になる
元の値が a,bなら
a+bとa-bだ

ところで、加算や減算を桁溢れしないようにすれば1bit増える。
ただし a+b が桁溢れする程大きければ  a-b はMSBとMSB-1は等しい
というように DCTした後の結果は完全に独立ではないから情報量として
は増えてはいない。
それでもレジスタとしては 64サンプルなら 6bit余計に必要って事だ
(完全に元に戻すなら小数点以下のガードビットが数ビット欲しい)
■ このスレッドは過去ログ倉庫に格納されています