
2026/01/10 9:23
「嘘を言う耳でそれを見てください。」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この記事は、画像処理のテクニック(短時間ウィンドウで平均化してダウンサンプリングする、ローリング平均フィルタでぼかす、ビット深度を減らす、遅延コピーを加える、ウィンドウ付きFFT解析を行う)を音声に適用し、ピクセレーション、ノイズ除去、エコー、フランジャー、コーラス、フェーザー、ピッチシフトなどの創造的効果を実現する方法を示しています。
- ダウンサンプリングは「音声ピクセレーション」を作り、ステップ波形アーティファクトによって金属音が生じます;ぼかしフィルタでこれらを除去します。
- ビット深度の低減は高周波ノイズ(ハイス)を導入し、デジタル→アナログ変換器はローパスフィルタリングでマスクします。
- 遅延・減衰コピーはエコーや位相効果(フランジャー、フェーザー、コーラス)を生成します。
- 周波数領域編集は画像圧縮でよく使われますが、音声ではほとんど使用されません;しかしそれがボコーダー、オートチューン、その他のスペクトルツールの基礎です。
単純に全音声FFTを行うとスペクトラムがぼやけるため、信号はHann(sin²)ウィンドウで20–100 msスライスに分割する必要があります。半相重畳(cos²)ウィンドウを使えば sin² + cos² = 1 により完全再構成が可能となり、クリックフリーの周波数領域編集(ピッチシフトなど)が実現します。
記事は教育目的で再帰FFT関数の簡易C実装も提供し、画像FFTで低周波成分をシフトする課題(犬の画像例)を示すことで、音声と画像のスペクトル操作の違いを強調しています。
今後の研究としては、高品質ピッチシフトが支配的なボーカル周波数を追跡し、無声音子音を補正する方法(簡略化された手法から脱却)を提案しています。これらの洞察は、オーディオエンジニアや開発者がデジタル→アナログパイプライン、創造的効果、および自然な音楽制作・消費機器向けピッチシフトツールを設計する際に役立ちます。
本文
過去数週間、私は侵襲的な考えを離せませんでした:ラスター画像とオーディオファイルは非常に似ている――それらはアナログ測定の連続であるため――同じ変換を両方に適用したらどうなるだろうか?
ダウンサンプリング
データストリームを n サンプルずつのバケットに分割し、各バケット全体を単一の平均値に置き換えるとどうなるでしょうか。
for (pos = 0; pos < len; pos += win_size) { float sum = 0; for (int i = 0; i < win_size; ++i) sum += buf[pos + i]; for (int i = 0; i < win_size; ++i) buf[pos + i] = sum / win_size; }
画像の場合、結果は見た目に優れたピクセルアートになります。
音声の場合……ヘッドホンを装着すると驚きの体験が待っています。
モデルイメージは犬「スカイ」。曲の抜粋はエフィー・パッセロによる “It Must Have Been Love” のカバーです。
オーディオ形式に精通していれば、低サンプリングレート特有のマuffledで中立的な再生になると予想したかもしれません。
しかし「音声ピクセル化」フィルターは不快な金属調のオーバートーンを追加します――波形の階段状パターンが元々存在しなかった広帯域ノイズを生成するためです。
アーティファクトの修正
ジグザグ波形にローリング平均フィルタ(ピクセル化画像のぼかしと同等)を適用します:
/* ... */
ビット深度の低減
44.1 kHz のサンプリングレートは維持しつつ、各サンプルのビット深度を下げる場合は?
/* signed int16_t バッファを仮定し、偶数 n なら n+1 レベルを生成 */ for (int i = 0; i < len; ++i) { int div = 32767 / (levels / 2); buf[i] = round(((float)buf[i]) / div) * div; }
答えは「はい」と「いいえ」の両方です:注入された誤差が平均周波数を高め、ハス(ざらつき)を生み出し、尖音ではなくなります。
画像の量子化よりもオーディオで品質損失ははるかに早く起こります。
遅延コピーの追加
画像を壊すようなオーディオフィルタも試せます:
for (int i = shift; i < len; ++i) buf[i] = (5 * buf[i] + 4 * buf[i - shift]) / 9;
写真の場合、小さなオフセットはぼかし、大きなオフセットは「ダブル露光」効果を生みます。
音声ではエコーやフェーザー・クロスサウンドのような位相シフト効果が現れます。
周波数領域解析
有限長信号はすべて正弦波に分解できます(DFT/FFT)。
画像では編集用途であまり使われず、主に圧縮、特徴検出、ノイズ除去に利用されます。
音声では周波数領域技術がボコーダーやオートチューンなどを可能にします。
C でのシンプルな FFT 実装
void __fft_int(complex *buf, complex *tmp, const uint32_t len, const uint32_t step) { if (step >= len) return; __fft_int(tmp, buf, len, step * 2); __fft_int(tmp + step, buf+step,len, step * 2); for (uint32_t pos = 0; pos < len; pos += 2*step) { complex t = cexp(-I*M_PI*pos/len) * tmp[pos+step]; buf[pos/2] = tmp[pos] + t; buf[(pos+len)/2] = tmp[pos] - t; } } void in_place_fft(complex *buf, const uint32_t len) { complex tmp[len]; memcpy(tmp, buf, sizeof(tmp)); __fft_int(buf, tmp, len, 1); }
変換はほぼ定常的な信号で最も効果を発揮します。
したがって、トラックを短いウィンドウ(20–100 ms)に分割して扱います。
ウィンドウ化と重ね合わせ
単純なウィンドウ FFT はウィンドウ境界でクリック音を生む可能性があります。
ハン窓を使用します:
y(t) = sin²(t), t ∈ [0, π]
これにより波形の端部がゼロになるよう減衰します。
不連続を避けるため、半分シフトしたウィンドウ(cos²(t))も計算します。
再構築は次の通りです:
out₁(t) = in(t) · sin²(t) out₂(t) = in(t) · cos²(t) out(t) = out₁(t) + out₂(t) = in(t)·[sin²(t)+cos²(t)] = in(t)
ハン窓の減衰は打ち消されますが、端部での不連続は除去されます。
実践的な応用
このテクニックを使えば、周波数領域で安全に編集できます――例えばボーカルのピッチシフトなど。
(サンプルコードは簡易例を参照)
犬の画像も変換してみました:低周波成分を高いビンへシフトすると不自然なエッジが生じ、逆に低くすると特徴的なぼかしになります。
まとめ
- ピクセル化(ダウンサンプリング)は画像では良好ですが、音声では階段状アーティファクトによる金属調ノイズを生成します。
- ローリング平均フィルタや適切なウィンドウ化でそのアーティファクトは除去できます。
- ビット深度の低減はマuffledではなくハス音(高周波誤差)を生じさせます。
- 重ね合わせとハン窓は周波数領域編集に不可欠です。
ぜひ実験してみてください――まだ多くの可能性が広がっています!