ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ヒルベルト変換による単側波帯変調

この例は、離散ヒルベルト変換を使用して単側波帯変調を実装する方法を示します。

ヒルベルト変換は、変調器と復調器、音声処理、画像診断、到来方向 (DOA) 測定など、基本的に複素数信号 (直交) 処理の設計を簡素化する場合に利用できます。

はじめに

単側波帯 (SSB) 変調は振幅変調 (AM) を効率的にした形式であり、使用する帯域幅は AM の半分になります。この方法は、電話、アマチュア無線、HF 通信などの音声に基づく通信用途でよく使用されています。この例は、ヒルベルト変換を使用して SSB 変調を実装する方法について示します。

SSB 変調においてヒルベルト変換の使用を推進するためには、両側波帯変調を最初に確認すると便利です。

両側波帯変調

両側波帯 (DSB) 変調は、AM を簡単にした形式であり、通常、搬送周波数のいずれかの波帯において変調された信号の周波数をシフトした 2 つのコピーで構成されます。正確には DSB 抑圧搬送波と呼ばれ、以下のように定義されています。

$$ f[n] = m[n]\cos( 2 \pi f_o n/f_s) $$

ここで、m[n] は通常メッセージ信号を示し、fo は搬送周波数を示します。上記の方程式で示すとおり、DSB 変調は、搬送波 cos(2*pi*fo*n/fs) をメッセージ信号 m[n] に乗算して算出します。したがって、フーリエ変換の変調定理を使用して変換 f[n] を計算できます。

$$ F(f) = \frac{1}{2} [M(f-f_o) + M(f+f_o)] $$

ここで、M(f) は、m[n] の離散時間フーリエ変換 (DTFT) です。メッセージ信号が帯域幅 W のローパスの場合、F(f) は帯域幅が 2 倍のバンドパス信号です。DSB 信号とそのスペクトルの例を見てみましょう。

% Define and plot a message signal which contains three tones at 500, 600,
% and 700 Hz with varying amplitudes.
Fs = 10e3;
t = 0:1/Fs:.1-1/Fs;
m = sin(2*pi*500*t) + .5*sin(2*pi*600*t) + 2*sin(2*pi*700*t);
plot(t,m);

% Plot annotations.
grid
xlabel('Time')
ylabel('Amplitude')
title('Message Signal m[n]')

ここでは、メッセージ信号のパワー スペクトルを計算してプロットします。

periodogram(m, [], 4096, Fs, 'power', 'centered');

% Let's zoom into the area of interest.
Xlims = get(gca,'XLim');
set(gca,'XLim',Xlims,'YLim',[-75 12])

両面パワー スペクトルは、DC 付近の 3 つのトーンを明確に示しています。さらに拡大すると、各成分のパワーを確認できます。

set(gca,'XLim',[0.1 1],'YLim',[-18 2])

500 Hz トーンのパワーは約 -6 dB、600 Hz トーンのパワーは約 -12 dB、700 Hz トーンのパワーは約 0 dB です。これは、それぞれ、1、0.5、および 2 のメッセージ信号のトーン振幅に相当します。

このメッセージ信号 m[n] を使用して、搬送波を乗算して DSB 信号を作成し、そのスペクトルを確認します。

fo = 3.5e3; % Carrier frequency in Hz
f = m.*cos(2*pi*fo*t);
idx = 100;
plot(t(1:idx),f(1:idx),t(1:idx),m(1:idx),'r:');   % View a portion.
grid

% Plot annotations.
xlabel('Time')
ylabel('Amplitude')
title('Message Signal and Message Signal Modulated')
legend('Modulated Message Signal','Message Signal m[n]')
set(gcf,'Color','white');

青色の実線は変調されたメッセージ信号、赤い点線はゆっくりと変化するメッセージ信号です。変調信号のパワー スペクトルは次のようになります。

periodogram(f, [], 4096, Fs, 'power', 'centered');

% Let's zoom into the area of interest.
Xlims = get(gca,'XLim');
set(gca,'XLim',Xlims,'YLim',[-75 0])
set(gcf,'Color','white');

メッセージ信号 (3 つのトーン) は中心周波数 fo にシフトします。さらに、各成分のパワーは、変調された m[n] の DTFT が示すように振幅が半減したため、4 分の 1 まで減少しています。さらに拡大して、新しいパワー値を確認します。

set(gca,'XLim',Xlims,'YLim',[-20 0])

正の周波数成分は、-6、-18、および -12 dB です。

ここまで DSB 変調を定義しました。次に単側波帯変調を確認します。

単側波帯変調

単側波帯 (SSB) 変調は DSB 変調と似ていますが、スペクトル全体を使用する代わりに、フィルターを使用して下側波帯または上側波帯を選択します。下側波帯または上側波帯を選択すると、それぞれ下側波帯 (LSB) 変調または上側波帯 (USB) 変調が実行されます。単側波帯のいずれかを除去するには、フィルターとフェージング法の 2 つの方法があります。上側波帯または下側波帯を選択的にフィルター処理するプロセスは、特に信号成分が DC に近い場合、厳密なフィルターが必要になるため困難です。この例は、SSB 変調の実装にヒルベルト変換を使用する、フェージング法の使用方法について示します。

SSB 変調では、上側波帯または下側波帯のフィルター処理を避けるなどの理由で、DSB 変調の場合と同様に周波数成分 X(f-fo) および X(f+fo) のペアを作成せずにメッセージ信号を別の中心周波数にシフトする必要があります。これは、ヒルベルト変換を使用して実行できます。

SSB 変調での使用について説明する前に、まず理想的なヒルベルト変換の定義とプロパティを確認します。これによって、SSB 変調で使用する理由がわかるでしょう。

理想的なヒルベルト変換

離散ヒルベルト変換は、信号の負の周波数の位相を 90 度進め、正の周波数の位相を 90 度遅らせるプロセスです。ヒルベルト変換 (+j) の結果をシフトして、元の信号に追加すると、以下に示すような複素数信号が生成されます。

mi[n] が mr[n] のヒルベルト変換の場合、次のようになります。

$$m_c[n] = m_r[n] + jm_i[n]$$

これは、解析信号とも呼ばれる複素数信号です。以下のブロック線図は、理想的なヒルベルト変換を使用した解析信号の生成を示しています。

解析信号の重要な特徴の 1 つが、スペクトル成分が正のナイキスト間隔で存在することです。これは、解析 (複素数) 信号の虚数部を 90 度 (+j) シフトし、これを実数部に追加すると、正の周波数の追加中は負の周波数が取り消されるためで、この結果、信号に負の周波数が存在しなくなります。また、複素数信号の周波数成分の振幅は、実信号の周波数成分の振幅の 2 倍になります。これは、片側スペクトルと似ていますが、正の周波数の信号の合計パワーを含んでいます。

次に、スペクトル シフターについて説明します。スペクトル シフターは、シフトするスペクトルの信号から形成された解析信号を変調して、信号のスペクトル成分をシフト (変換) します。この概念は、後で説明する SSB 変調で使用します。

スペクトル シフター

上記で定義したメッセージ信号 m[n] を使用して、ヒルベルト変換を使用し、解析信号を作成します。そして、この解析信号を目的の中心周波数に変調します。この仕組みを以下のブロック線図に示します。

このスペクトル シフト方法を使用すると、最終的な実数値信号を維持しながら信号のパワーを目的の周波数にシフトできます。

これまでに説明したように、解析信号は元の実数値信号とその実信号のヒルベルト変換で構成されます。Signal Processing Toolbox™ で関数 hilbert を使用して実信号を実行すると、解析信号が生成されます。

メモ:関数 hilbert は虚数部だけでなく、全体的な解析 (複素数) 信号を生成します。

mc = hilbert(m);

メッセージ信号 m[n] から作成された解析信号のスペクトル成分を計算してプロットします。

periodogram(mc, [], 4096, Fs, 'power', 'centered');
set(gcf,'Color','white');

% Let's zoom in.
Xlims = get(gca,'XLim');
set(gca,'XLim',Xlims,'YLim',[-75 6])

スペクトル プロットに示されているように、解析信号は複素数信号で、正の周波数成分のみが含まれています。さらに、パワーを測定するか、正の周波数成分でプロットをさらに拡大すると、解析信号の周波数成分のパワーが実信号の正の (または負の) 周波数成分の合計パワーの 2 倍であることがわかります。たとえば、これは、信号の合計パワーを含んでいる片側スペクトルに似ています。以下の拡大したプロットを参照してください。

set(gca,'XLim',[0.1 1],'YLim',[-10 6])

解析 (複素数) 信号の周波数成分 500、600、および 700 Hz のパワーは、それぞれ約 0、-6、および 6 dB で、元の信号の合計パワーです。これらの値は、それぞれ振幅が 1、0.5、および 2 の 3 つのトーンをもつ元の実数値信号に相当します。

このとき、周波数成分のペアを作成せずに、解析信号を変調してスペクトル成分を別の中心周波数にシフトすると共に、実数値信号を維持できます。

信号を搬送周波数 fo に変調するには、指数を解析信号に乗算します。

mcm = mc.*exp(1i*2*pi*fo*t);

スペクトル シフターのブロック線図に示すように、信号を変調したら、実数部を計算します。スペクトルは次のとおりです。

periodogram(real(mcm), [], 4096, Fs, 'power', 'centered');

% Zooming in we get
Xlims = get(gca,'XLim');
set(gca,'XLim',Xlims,'YLim',[-75 0])
set(gcf,'Color','white');

上記のプロットに示すように、周波数のペアを作成せずに信号が新しい中心周波数 fo に変調されました。この場合は上側波帯が生成されました。

上記のスペクトル プロットと DSB 変調のスペクトル プロットを比較すると、スペクトル シフターによって SSB 変調が実行されたことを確認できます。

SSB 変調の効率的な実装

これまでに導き出した内容から、SSB 変調信号 f[n] を次のように記述できます。

$$ f[n] = \Re[ m_c[n] \exp(j2 \pi f_o n/f_s) ] $$

ここで、mc[n] は次のように定義される解析信号です。

$$m_c[n] = m[n] + j \tilde{m}[n]$$

この式を展開して実数部を取り出すと、次のようになります。

$$ f[n] =  [m[n] \cos( 2 \pi f_o n /f_s) - \tilde{m}[n] \sin( 2 \pi f_o n/f_s)] $$

この式によって、単側波帯として上側波帯 (SSBU) が得られます。同様に、次の式によって SSB 下側波帯 (SSBL) を定義できます。

$$ f[n] = \Re[ m_c[n] \exp(-j2 \pi f_o n/f_s) ] $$

$$ f[n] =  [m[n] \cos( 2 \pi f_o n /f_s) + \tilde{m}[n] \sin( 2 \pi f_o n/f_s)] $$

上記の SSBU 式から、さらに効率よく SSB を実装する方法がわかります。mc[n] と exp(j*2*pi*fo*n/fs) の複素数乗算を行って虚数部を取り除くよりも、以下の方法で SSBU を実装して必要な値のみを計算できます。

上記の SSB 変調を実装するには、メッセージ信号 m[n] のヒルベルト変換を計算し、両方の信号を変調しなければなりませんが、理想的なヒルベルト変換は現実的ではありません。ただし、Parks-McClellan FIR フィルター設計法などのヒルベルト変換を近似するアルゴリズムが開発されており、使用できます。MATLAB Signal Processing Toolbox™ では、このようなフィルターを設計する関数 firpm が用意されています。また、このフィルターによって遅延が生じるため、遅延 (N/2、ここで N はフィルター次数) を以下のように余弦項を乗算する信号に追加して遅延を補正する必要があります。

FIR ヒルベルト変換の場合、偶数長フィルターよりも計算が効率的な奇数長フィルターを使用します。偶数長フィルターを使用すると通過帯域誤差が小さくなりますが、奇数長フィルターを使用しない場合、これらのフィルターの係数の一部がゼロになります。また、奇数長フィルターを使用する場合、偶数長フィルターで必要な分数の時間遅れではなく、整数の時間遅れによるシフトが必要になります。奇数長フィルターの場合、ヒルベルト変換の振幅応答は、w = 0 および w = pi のときゼロになります。偶数長フィルターの場合、振幅応答が pi で 0 である必要はないため、帯域幅が増大します。したがって、奇数長フィルターでは、使用可能な帯域幅が次のように制限されます。

$$ 0 < w < \pi $$

フィルターを設計して、ゼロ位相応答をプロットします。

d = fdesign.hilbert('N,TW',60,.1);
Hd = design(d,'equiripple');
hfv = fvtool(Hd,'Analysis','Magnitude',...
    'MagnitudeDisplay','Zero-phase',...
    'FrequencyRange','[-pi, pi)');
set(hfv,'Color','white');

ヒルベルト変換を近似するには、フィルターを使用してメッセージ信号をフィルター処理します。

m_tilde = filter(Hd,m);

上側波帯信号は次のようになります。

G = order(Hd)/2;   % Filter delay
m_delayed = [zeros(1,G),m(1:end-G)];
f = m_delayed.*cos(2*pi*fo*t) - m_tilde.*sin(2*pi*fo*t);

スペクトルは次のようになります。

periodogram(f, [], 4096, Fs, 'power', 'centered');

% Zooming in we get
Xlims = get(gca,'XLim');
set(gca,'XLim',Xlims,'YLim',[-75 0])
set(gcf,'Color','white');

上記のプロットからわかるように、メッセージ信号 (3 つのトーン) を 3.5 kHz の搬送周波数に正常に変調して、上側波帯のみを維持できました。

まとめ

これまで見てきたように、ヒルベルト変換の近似を使用して、解析信号を生成できます。この方法は、スペクトル シフトを必要とする多くの信号アプリケーションで応用できます。特に、近似ヒルベルト変換を使用して単側波帯変調を実装する方法について説明しました。

この情報は役に立ちましたか?