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

このエントリーをはてなブックマークに追加
1かんせい
WAVファイルを効率よく可逆圧縮するにはどうしたらいいんでしょうか?
よくあるのは、差分とってハフマン圧縮だと思いますが、
もっと圧縮率を上げられないのでしょうか。

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

非可逆圧縮の多くは
 コサイン変換を使う
 予測係数を使う
のどちらか又は両方ですね
6名無しさん@お腹いっぱい。:2000/12/25(月) 19:13
差分じゃなくて、加速度じゃだめなん?
7SAGE:2000/12/25(月) 19:20
>効率の良い非可逆圧縮を使って源信号との差分を可逆圧縮

 Wavelet + RangeCoder 辺りでど〜よ。
8かんせい:2000/12/25(月) 20:14
>5

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

>6

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

単純な線形予測係数と残差はどうでした?
11かんせい:2000/12/25(月) 21:06
>9

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

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

>10

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

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

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

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

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

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

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

>15

なるほど。ありがとうございます。やってみます。
17デフォルトの名無しさん:2000/12/26(火) 14:18
ウエブレットでパラメトリック分析して残差圧縮というのも
18名無しさん@お腹いっぱい。:2000/12/26(火) 14:56
http://www.csdinc.co.jp/archiver/
この辺、利用させて貰うとかだめ?
外していたらごめんなさい。
19名無しさん@お腹いっぱい。:2000/12/26(火) 15:32
データを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レジスタを回転させながら再生します
20かんせい:2000/12/26(火) 19:12
>17

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

>19

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

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

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

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

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

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

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

#いっておきますが28じゃないです(w
31デフォルトの名無しさん:2000/12/29(金) 15:22
>>30
やりたい事によりますよ。 というかそんなに良い本はありません
32名無しさん:2000/12/29(金) 20:50
とりあえず「やりなおしの工業数学」って本を買ってきました(w
33デフォルトの名無しさん:2000/12/29(金) 21:02
>>27 のプロフィール、
>情報理論については、中学2年頃からはまり、特にデータ圧縮である
>LZ法、BlockSorting法、PPM法、その他様々な方法を一通りやってきている。
若気の至りと言う奴なんだろうかな
34デフォルトの名無しさん:2000/12/29(金) 21:19
29のツッコミってなんか変じゃないか?
35>28:2000/12/29(金) 22:53
俺には至って普通のプログラムに興味ある高校生にしか見えないが?
36デフォルトの名無しさん:2000/12/29(金) 23:03
俺も高校の頃は画像圧縮アルゴリズムを色々とやってたな。
実は圧縮アルゴリズムってやってる奴結構多くないか?
37デフォルトの名無しさん:2000/12/29(金) 23:15
自力で考え出すのは難しく、しかし追いかけるのは案外簡単で
しかも結構面白いのが圧縮だね
38名無しさん:2000/12/29(金) 23:15
高校生でDB接続なんてやってたらへんだろ
39便乗さん:2000/12/30(土) 01:40
すいません,便乗なんですけど,
wavファイルをtxt形式に変換(その逆も)する方法か,
ソフトがありましたら教えていただけないでしょうか?
おねがいします
40>39:2000/12/30(土) 02:06
BASE64 , ISH
「wav形式をtxt形式に変換」と言うより
「BinaryをTextに変換」と言った方が正しくないかい?
41デフォルトの名無しさん:2000/12/30(土) 05:09
ブロックソーティングはWAVには向かない気がするがどうよ?
42>41:2000/12/30(土) 07:39
前処理して単純差分とか 予測係数残差とかを圧縮するという話でしょう
43>39:2000/12/30(土) 08:28
サウンドカード2枚差してViaVoice
44デフォルトの名無しさん:2000/12/30(土) 09:21
dump.exe使えや。
45名無しさん@お腹いっぱい。:2000/12/30(土) 16:35
dump - ext2 filesystem backup
46うぉろ:2001/01/05(金) 15:01
遮断周波数や許容リプル等を入力するだけで、
IIRの伝達関数が出てくる、IIRの設計ツール知りませんか?
FIRならいっぱいあるんだけど…
47デフォルトの名無しさん:2001/01/05(金) 16:01
48sage:2001/01/05(金) 21:57
フーリエ変換してMIDI形式で保存
4948:2001/01/05(金) 21:57
しまった
50デフォルトの名無しさん:2001/01/05(金) 23:17
>>48 うん板井さんだね。 >フーリエ変換してMIDI形式で保存
51デフォルトの名無しさん:2001/04/03(火) 20:59
>>41
ブロックソーティングやってみたよ。単純には適用できないね。
波形毎にソートして、差分をとったらどうだろう?
52デフォルトの名無しさん:2001/04/04(水) 01:01
Plzというwavの圧縮方法もある。
ソースもついてたような気がするんで探してみては?
53デフォルトの名無しさん:2001/04/04(水) 10:26
>>18
戸田さん?
54デフォルトの名無しさん:2001/04/05(木) 12:25
>>52
plz可逆じゃないよ。
アフィン変換のパラメータを保存する方式。
でも方針としては、使えそう。1波形を基本にする
のだと思うな。
55兄ヲタ:2001/04/05(木) 12:30
最近は「外してたらごめんなさい」って言うとみんな戸田さんに
なるのか。戸田恵子マンセ〜
(アンパンマンじゃなくてカララとかマチルダとかキャッツアイの瞳とか
洋画の吹き替えの声ね。ダンナと知り合ったのは「地球へ・・・」の時ですか?)
56デフォルトの名無しさん:2001/04/05(木) 16:18
TOWNSの戸田さんかと思った
57名無しサンプリング@48kHz:2001/04/05(木) 18:05
>>48

めっちゃ非可逆じゃん。
58板井さん:2001/04/23(月) 22:48
>>57 (藁
圧縮というよりは、採譜であろう。

非可逆の話題は別スレを立てたほうが良いのかな。あと、画像とか動画とか。
59デフォルトの名無しさん:2001/06/11(月) 23:34
60名無し:2001/06/12(火) 00:39
KLTの解説ないすか?
61デフォルトの名無しさん:2001/06/12(火) 00:58
空間コヒーレンスでは画像ほどではないけど強い訳だから、
256バイト単位でDCT変換して2二元ハフマン圧縮したら結構な
圧縮になるのでは?算術を実数ではなくて整数近似計算させれば
可逆になるだろうし。
62デフォルトの名無しさん:2001/06/12(火) 01:03
>>59
そこの住人、煽るんだったらちゃんと煽ればいいのに(藁)
63デフォルトの名無しさん:2001/06/12(火) 09:46
>61 256バイト単位という事は 64サンプル毎にDCTするって事?

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

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

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