
CDと比較して アナログレコードの音質が好まれる要因はレコードから音を取り出すカートリッジによる倍音やクロストークによるものでは無いか?と過去記事(ここをクリックして参照)で考察しています。 そこでPythonを使って CD音源に人工的にその要因を加えたらどうなるかを検証することを思い立ち実験してみることにしました。
Pythonコードの作成に当り、ChatGPTを活用することにしました。 本記事では、経過とテスト結果をレポートします。
DL103Rカートリッジの倍音とクロストーク特性を数値化する
”アナログ・レコード感”を再現するため、Pythonを用いたプログラムに、DL-103Rカートリッジの実測による倍音成分とクロストーク特性を数値化したデータを予め組み入れる必要があります。 ここでは、その数値化データの取得方法について説明します。
倍音特性の数値化
スペクトル出典元:テストレコード(AD-1)によるレコードプレーヤーの特性結果・総覧より倍音とは、基音に対して整数倍の周波数成分を持つ信号で、「ハーモニクス」とも呼ばれます。上のスペクトル図に示すように、DL103Rカートリッジでは、レコード盤に刻まれた1kHzの正弦波をトレースすると、カートリッジ自体の機械的共振によって、その整数倍の周波数成分(倍音)が、基音よりも減衰した形で観測されます。 また、スペクトル画面の左枠に表示されているTHD(歪率)で見ると約0.5%程度を示しています。(なお、CD再生では機械的共振が存在しないため、このような倍音は発生しません。)
上のスペクトル図より読み取った数値化データは以下の通り。
倍音・数値化データ
| 基音 | 1次 | 2次 | 3次 | THD(歪率) |
| 1khz:-20db | 2khz:-60db | 3khz:-70db | 4khz:80db | 0.5% |
クロストーク特性の数値化
クロストークの要素は、クロストーク量とクロストーク位相角があります。
1)クロストーク量
スペクトル出典元:DENON MCカートリッジ DL103Rのクロストーク「 改善編」よりクロストークとは、本来独立して再生されるべき左右の音(ステレオ)が混ざってしまう現象です。アナログレコードでは1本のスタイラス(針)を使い、45-45ステレオ 方式で左右の音を再生していますが、構造上完全に分離することはできません。
たとえば、右チャンネル(Rch)が無音の状態でも、左チャンネル(Lch)の音がわずかに漏れ聞こえてしまいます。これがクロストークで、上のスペクトルで示される様に、-20db〜-30dbのクロストーク量があります。
2)クロストーク位相角

DL103Rカートリッジの場合、上のリサージュ波形において約30dB程度のクロストークが確認されており、さらにリサージュ図では位相角が約160°であることも示されています。
クロストーク・数値化データ
| クロストーク量 | 位相角 |
| 1khz:-20db〜-30db | 160° |
ChatGPTによるCD音源に“レコード感”を加えるPythonスクリプトの作成
ここでは、CD音源に“レコード感”を加えるためのPythonコードを、ChatGPTを活用して作成しました。 ChatGPTに、倍音やクロストークの前記 数値化データをCD音源に加えるよう指示するプロンプトを与え、それに基づいてCD音源に“レコード感”を加えるPythonスクリプトを作成させました。
簡単な経過説明
- 使用したChatGPTのバージョンは 1.2025.189 で、macOS版のデスクトップアプリを使用しています。
- 以下に示すPythonスクリプトは、満足のいく結果が得られるまでに、ChatGPTに対して5回以上のプロンプト調整を繰り返して作成したものです。
- 前述の数値データは、必要に応じて一部修正や値の丸めを加えながらChatGPTに指示しました。 特に倍音によるTHD(全高調波歪率)については、CD音質との差を強調するために0.5%を故意に大きくして→ 2%へ変更しています。
- 量子化ノイズを低減する目的で、三角ディザ(ノイズ)を付加しています。
Python ライブラリのインストール
Pythonスクリプトを使用するため以下の、Python ライブラリ(プラグイン)を事前にターミナルからインストールします。
command 事前インストールライブラリ pip3 install numpy scipy soundfile インストール済ライブラリを確認するには、以下を実行 pip3 list
下に示すPythonスクリプトは、実験結果をChatGptにフィードバックしながら修正を加えて バージョン250723として現在に至っています。 参考として、ソースコードを以下に示します。
(v250723)完成したPythonスクリプト
Pythonスクリプトの使い方:当サイトでは、Appleのショートカットアプリを使って「シェルスクリプトを実行」(シェル:Python 3)エリアに下に示すPythonスクリプトをコピー&ペーストし、実行しています。 input_file にCDファイルをフルパスで記述し、output_file にフルパスで出力名を記述し、実行するとCD音源に“レコード感”が加えられたファイルが出力されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# 「THD 2% を目標、クロストーク付加(-25 dB / 160°)とする完全コード」(自動ゲイン補正あり) import numpy as np import soundfile as sf from scipy.signal import hilbert # === 入出力ファイル === input_file = "input_44kHz_16bit.wav" output_file = "output_thd2_xtalk.wav" # === ステレオで読み込み === signal, sr = sf.read(input_file) if signal.ndim == 1: signal = np.tile(signal[:, None], (1, 2)) # モノラル → ステレオ # === ゲイン自動スケーリング(THD ≒ 2% 目標)=== def scale_gains_for_target_thd(signal, ref_amp=0.2): peak = np.max(np.abs(signal)) if peak == 0: return 0, 0, 0 g2_ref, g3_ref, g4_ref = 0.35, 0.22, 0.10 scale = ref_amp / peak return g2_ref * scale, g3_ref * scale**2, g4_ref * scale**3 g2, g3, g4 = scale_gains_for_target_thd(signal) # === 倍音付加処理(安全なスケーリング付き)=== def add_harmonics_stereo_safe(stereo_data, g2, g3, g4): L = stereo_data[:, 0] R = stereo_data[:, 1] def harmonic_func(x): return x + g2 * x**2 + g3 * x**3 + g4 * x**4 Lh = harmonic_func(L) Rh = harmonic_func(R) combined = np.stack((Lh, Rh), axis=1) # 絶対誤差で-0.5dbオフセットしたので、正規化を停止 # オーバーフロー防止(正規化) # peak = np.max(np.abs(combined)) # if peak > 1.0: # combined /= peak return combined signal_processed = add_harmonics_stereo_safe(signal, g2=g2, g3=g3, g4=g4) # === クロストーク付加処理(-25dB, 160°)=== def add_crosstalk(stereo_data, level_db=-25.0, phase_deg=160.0): """ クロストークを加える処理 - level_db: クロストークの振幅レベル(デシベル) - phase_deg: クロストークの位相差(度) """ L = stereo_data[:, 0] R = stereo_data[:, 1] gain = 10 ** (level_db / 20.0) # ≒ 0.056 phase = np.deg2rad(phase_deg) # ≒ 2.79 rad # ヒルベルト変換で90°シフト → 任意位相合成 R_hilb = np.imag(hilbert(R)) L_hilb = np.imag(hilbert(L)) L_new = L + gain * (np.cos(phase) * R - np.sin(phase) * R_hilb) R_new = R + gain * (np.cos(phase) * L - np.sin(phase) * L_hilb) return np.stack((L_new, R_new), axis=1) signal_processed = add_crosstalk(signal_processed, level_db=-25.0, phase_deg=160.0) # === 三角ディザ(TPDF) + 16bit 整数化 === def apply_tpdf_dither(signal_float): scale = 2**15 dither_amp = 1.0 / scale noise = (np.random.rand(*signal_float.shape) - np.random.rand(*signal_float.shape)) * dither_amp signal_dithered = signal_float + noise signal_int16 = np.clip(np.round(signal_dithered * scale), -32768, 32767).astype(np.int16) return signal_int16 signal_int16 = apply_tpdf_dither(signal_processed) # === 保存(WAV または FLAC)=== sf.write(output_file, signal_int16, samplerate=sr, subtype="PCM_16") # FLACなら format='FLAC' を追加 # === ログ出力 === print("✅ 出力完了:", output_file) print(f"使用ゲイン(THD ≒ 2% 自動スケーリング): g2 = {g2:.4f}, g3 = {g3:.4f}, g4 = {g4:.4f}") print("✅ クロストーク付加済み:-25 dB / 160°") |
テスト音源で倍音やクロストークの付加状況を確認する
テスト用ピュアー音源の作成
Pythonスクリプトv250723により人工的に付加される倍音およびクロストークの程度を定量的に調べるために、先ずWaveGeneでテスト用ピュアー音源を作成します。
CDフォーマット(16bit 44.1khz)で5秒間のwavファイルのテスト音源を作成しました。
- 倍音確認用テスト音源-1
-20db sin 100khz、-20db sin 1khz 、-20db sin 5khz - 倍音確認用テスト音源-2
複合波(-20db sin 100khz、-20db sin 1khz 、-20db sin 5khz) - クロストーク確認用テスト音源
Lchのみ sin 1khz -20db で記録したステレオ音源
WaveGenでsin 1khz -20db ステレオファイルを作成します。 このステレオファイルをAudacityに取り込み、「ステレオトラックを分離」を実行します。 Rchを選択して「生成」タグの無音を選択します。 LchとRchトラックを選択して「ステレオトラックを作成」を実行し、最後に、WAV形式でエクスポートします。
テスト音源における確認結果
Pythonスクリプトv250723で変換されたファイルをWaveSpectraでスペクトルやリサージュを描画し、倍音やクロストークの付加状況を定量的に確認します。
1️⃣ 倍音確認用テスト音源-1の状況
100Hz、1khz、5kHzの単独テスト音源毎のスペクトルを色を変えて重ねて描画しています。 ○で示されている倍音が付加さているのが分かります。
倍音確認用テスト音源-1 結果マトメ
- 基音・周波数レベルは、-20dbで、元のテスト音源のレベルと一致しています。
- 人工的に付加された倍音は、1次倍音:-50db 、2次倍音:-70db 、3次倍音:-100dbになっています。
- 夫々のTHD(歪率)は、約2%でした。
- 三角波ディザを付加しているため、ノイズフロアは-140dB程度です。
- 以上の結果は、当初設定した数値化したデータと略一致しています。
2️⃣ 倍音確認用テスト音源-2の状況
複合波(-20db sin 100khz、-20db sin 1khz 、-20db sin 5khz)OriginalとPythonスクリプトで変換した際のスペクトルを示しています。
Pythonスクリプトで変換すると、基音の周囲に複数のピークが現れました。 これは、倍音と基音の 相互変調(IMD:Intermodulation Distortion / 混変調歪) によるものと考えられます。 この結果がリアルサウンドで聴いた時にどの様に影響されるか?興味のある所です。
3️⃣ クロストーク確認用テスト音源の状況
Lchのみ sin 1khz -20db で記録したステレオ音源をPythonスクリプトで変換した時のRchへの漏れ量(クロストーク)をスペクトルで示し、位相角をリサージュ図で示しています。
Lch Rch のスペクトル
図中に示す様に、人工的に付加されたクロストークは-20dbになり、位相角は、Lch Rch のリサージュ図から、159.5°になっています。 これは、当初設定した数値データと一致しています。
Pythonスクリプトで変換した「クロストーク確認用テスト音源」をAudacityに取り込み、「ステレオトラックを分離」を実行します。 分離されたRchのレベルをLchレベルに合わせるため、Rchのトラックを選択し、「ノーマライズ」を選択して-20dBを実行します。 最後に、2つのトラックを選択し、「ステレオトラックを作成」を実行した後、WAV形式でエクスポートします。 エクスポートされたファイルをWaveSpectraにドラッグアンドドロップし、リサージュ図を描画します。
リアルサウンドのCD音源をPythonスクリプトで変換した音源を試聴する。
テスト対象のリアルサウンド(CD)ファイルとPythonスクリプトv250723で変換したファイルを以下に示します。 「差分による絶対誤差」および試聴による比較を行います。
1964年録音・ドボルザークの新世界より第4楽章 Karajan指揮 BPO
1966年録音・ヘンデル バイオリン・ソナタ 第4番 第1楽章 Vn:グリュミオー
試聴結果
イヤホンでの試聴では、CD音源と比較して、両者音源共に殆ど音質差は感じられませんでした。 次に、我が家のB級オーディオで聴いてみました。 CD音源との差は僅かなので、プラセボ効果の可能性もあり得ますが下に試聴結果を示します。
- 「Karajanの新世界より第4楽章」では、奥行きが増した様に聴こえました。
- 「グリュミオーが弾くヘンデル バイオリン・ソナタ」 では、バイオリンが柔らかく、チェンバロの音像がハッキリした様に聴こえました。
なお、今回比較した音源が、SPARSコードADD でアナログ・マスターテープからCD化されている音源を使いました。 デジタル・マスターからCD化されたSPARSコードDDDのCDを使う方がPythonスクリプトv250723で変換した時の音質差が明瞭に現れるかも知れません。
〜〜〜〜〜〜
それにしても、倍音によるTHD(全高調波歪率)を2%に悪化させても試聴差は殆ど感じられないとは驚きでした。 今まで例えばアンプの歪率に拘っていましたが、今回の実験結果から、それ程神経質にならなくても良いかも知れませんね。
まとめ ― 今回の実験を通して見えたこと
今回の実験では、CD音源に対して人工的に倍音やクロストークを加えることで、アナログレコードのような音質をどこまで再現できるかを検証するものでした。
基本的な実験結果では、倍音やクロストーク、位相角など、当初の予想通りの結果が得られました。しかしながら、実際のリアルサウンドの試聴結果においては、バイオリンの柔らかさやオーケストラの奥行き感など、僅かな変化は認められたものの、プラセボ効果の可能性を否定できるものではありませんでした。
すなわち、実際のレコード音源と比較すると、依然として細部においてCDとの違いがあり、「リアルなアナログ・レコード感」を実現したとは言い切れるものではありませんでした。 この要因として、例えば、クロストークは単に振幅と位相を設定するだけでは不十分であり、実際のカートリッジでは周波数によってクロストーク量が変化する「バスタブ状の特性」を示すことが挙げられます。 このような特性を含め、レコード再生には多くのアナログ的要素が複雑に関係しています。
これらすべてを人工的に再現することは容易ではないことを、今回の実験を通して改めて認識しました。
以上、「CD音源に“レコード感”を加える:倍音とクロストークの実験的アプローチ」でした。 今回の実験がCDのレコードライク化に関するご参考になれば幸いです。
おすすめ記事
-
-
CD音質をレコードライク・サウンドに変換する「Nostalgic Sound Converter」ソフトを試してみました。
アナログレコードがCDより好ましく聴こえるのは、レコードのダメな点によって再生音が歪んだとしても、倍音成分の連続性を持ち、好ましい音質に変質するのでは無いか?という推論を「アナログレコードのここがダメ ...
-
-
iPhoneのハイレゾ化アプリ「パイオニア・Stellanova(MSR機能:bit拡張と高域補完)」の実力は?
2020年10月27日にパイオニアのMSR機能(マスターサウンドリバイブの略)を搭載したiPhone/iPad/iPod touch専用音楽アプリケーション・パイオニアの「Wireless Hi-Re ...






