1. 自由研究に戻る
  2. Menu表示


Octaveで学習、通信システム

本内容は、参考文献をもとに、Octaveを使って信号処理の学習(復習)です。進めていくうちに多くのwebページにお世話になりました。感謝します。

1、Octaveで学習(FFT)

サンプリング数NのFFT(離散フーリエ変換(DFT))を考えます。
(1)FFTはデータ数N個の周期性を持ち、k=0とk=N-1に近い次数のスペクトラム成分は低周波数成分を、k=N/2に近い成分は高周波数成分を持っています。
(2)また、連続信号に対する負のスペクトラムはFFTではk=N/2からk=N-1にシフトする(信号が実数であれば、FFTの振幅スペクトラムはk=N/2で左右対称になります。
(3)実信号で、フーリエ逆変換の元スペクトラムは、共役複素数対になっています。
(4)サンプリング定理にありますように、サンプリングされた信号のスペクトラムは、サンプリング信号ごとにベースバンドのスペクトラムが並びます。 石田さんの例題を少々改造しN個まで表示してみますと、先述の性質が確認できます。

clear 
t=0:0.001:1.3; # サンプリング周波数1000Hz
y=sin(2*pi*50*1000/512*t)+sin(2*pi*100*1000/512*t); #50*1000/512Hzと100*1000/512Hzの信号
Y=fft(y,512); #512フーリエ変換により周波数領域に変換 
Pyy=Y.*conj(Y)/512; # Pyy−スペクトル密度conj−複素共役 
f=1000*(0:511)/512; 

subplot(2,1,1)
plot(f,Pyy(1:512)) 
title("spectrum1   f1=50*1000/512Hz,f2=100*1000/512Hz") 
xlabel("(Hz)") 
grid "on";

y=sin(2*pi*100*t)+sin(2*pi*200*t); #100Hzと200Hzの信号
Y=fft(y,512); #512フーリエ変換により周波数領域に変換 
Pyy=Y.*conj(Y)/512; # Pyy−スペクトル密度conj−複素共役 
f=1000*(0:511)/512; 

subplot(2,1,2)
plot(f,Pyy(1:512)) 
title("spectrum2   f1=100Hz,f2=200Hz") 
xlabel("(Hz)") 
grid "on";
k=N/2(ここでは 500Hz)で左右対称になる。下側の図supectrum2は振幅スペクトラムが小さくなるので注意。(サンプリング周波数1KHz)

FFT1

他に注意したいことは、振幅スペクトラムが正しく再現できる周波数とできない最小分解周波数があるようです。Δf最小分解周波数=FFTのサンプリング周波数/FFT点数の整数倍であれば、振幅スペクトラムは再現できます。
例題のspectrum1は50*1000/512Hzと100*1000/512Hzの信号のFFT、spectrum2は100Hzと200Hzの信号のFFTである。振幅スペクトラムが同じくならないで、100Hz,200Hzのは小さくなっているので注意が必要です。

・2008年5月15日(書き始め)

2、信号の複素化

(1)実信号を本当は二つの共役複素数の集合と考え、たまたま虚数部がキャンセルされた信号と考えることができます。
(2)直交復調を用いるパス・バンド複素化とヒルベルト変換を使うベースバンド複素化がある。

 パスバンド複素化( 直交復調 )
入力信号ーー>*(掛ける)cosーー> I成分
入力信号ーー>*(掛ける)sinーー> Q成分
上記の様にsinを乗算すれば正の信号が、-sinを乗算すれば負の信号が取り出せる。このようiなデジタルミキサでは一つの信号が取り出せる。

 ヒルベルト変換
hilbert(x),hilbert(x,n)関数が用意されてます。

(3)FFTすると実部と虚部があらわれ、周波数軸上で信号の複素化がおこなわれる。
(4)実信号ではスペクトラムは共役複素数対であるが、複素データ(データは実数でも同じようになる)では、共役複素対にならなくてもよい。
(4)たとえば負の信号スペクトラムだけを作ることもできる。
 例 FFT(複素信号)−>IFFT−>FFT
 FFTポイント数512個、複素データを作り(N=150,N=413,N=463)、それをIFFTしたのちFFTした結果です。
 複素データで作った正(N=150)および負(N=413,463)のスペクトラムともに復元されていることがわかります。共役複素対にならなくてもよいことが確認できます。
 

FFT2


 clear 
% FFTポイント数512
Y=zeros(512,1);%512ポイント全クリア
Y(150)=0-256*i;%150番目にスペクトラムを立てる
Y(413)=0-256*i;%413番目にスペクトラムを立てる
Y(463)=0-256*i;%463番目にスペクトラムを立てる

Pyy=Y.*conj(Y)/512; # Pyy−スペクトル密度conj−複素共役 
subplot(2,1,1)
plot(Pyy)
axis([0 512 0 150])
title("spectrum3 N=150,413,463") 
xlabel("(FFT points)") 
grid "on";

IY=ifft(Y); %IFFT
FY=fft(IY); %FFT

Fyy=FY.*conj(FY)/512; # Pyy−スペクトル密度conj−複素共役 

subplot(2,1,2)
plot(Fyy)
axis([0 512 0 150])
title("spectrum4 FFT(IFFT(spectrum3))"); 
xlabel("(FFT points)") 
grid "on"; 
 
 

3、オーバーサンプリング

(1)オーバーサンプリングになっても信号の帯域は変わらない。
(2)エイリアシング成分が高域になり、CRフィルタで除去しやすくなる。
(3)D/Aの中にオーバーサンプリング機能が付いているものがある。
(4)実際にはサンプル間にゼロを挿入することでオーバーサンプリングする。さらにオーバーサンプリングフィルタで元のスペクトラム以外のを取り除いて、オーバーサンプリングデータを作ります。
(5)サンプリング波形がスムーズ(滑らか)になります。事項のFIRフィルターの項で確認します

octaveに用意されている関数には下記があります。
usage: y = interp(x, q [, n [, Wc]])
y = upsample(x,n,phase)

(例)1KHzでサンプリングした時間波形とそのFFT波形(supectrum1)は下記になります。

OverSamppling

上図の信号を2倍のオーバーサンプリングの時間波形とFFT波形(supectrum2)は下記になります。

OverSamppling

clear 
t=0:0.001:1.3;# サンプリング周波数1000Hz
y=sin(2*pi*50*1000/512*t)+sin(2*pi*100*1000/512*t); #50*1000/512Hzと100*1000/512Hzの信号
Y=fft(y,512); #512フーリエ変換
Pyy=Y.*conj(Y)/512; # Pyy−スペクトル密度conj−複素共役 
 
subplot(2,1,1);
plot(t,y); 
axis([0 0.05 -2 2])

title("Time domain f1=97.65Hz, f2=195.31Hz") 
xlabel("(sec)") 
grid "on";

f=1000*(0:511)/512;
subplot(2,1,2)
plot(f,Pyy(1:512))
title("spectrum1  ") 
xlabel("(Hz)") 
grid "on";

nn = 512;
ze = zeros(2*nn,1);
for m=1:nn
	ze(2*(m-1)+1)=y(m);
	ze(2*(m-1)+2)=0;  %0挿入
end

figure
tt=0:0.0005:0.5115;
subplot(2,1,1)
plot(tt,ze)
axis([0 0.05 -2 2])
title("X2 over samppling  f1=97.65Hz,f2=195.31Hz") 
xlabel("(sec)") 
grid "on";

FFTze=fft(ze,1024);
PPyy=FFTze.*conj(FFTze)/512; # Pyy−スペクトル密度conj−複素共役 
subplot(2,1,2)
f2=2000*(0:1023)/1024;
plot(f2,PPyy(1:1024));
title("spectrum2  X2 over samppling ") 
xlabel("(Hz)") 
grid "on";
%FIR フィルター
F=[8;0;24;0;58;0;-120;0;221;0;-380;0;619;0;-971;0;1490;0;-2288;0;3649;0;-6628;0;20750;32768;20750;0;-6628;0;3649;0;-2288;0;1490;0;-971;0;619;0;-380;0;221;0;-120;0;58;0;-24;0;8];

figure
subplot(2,1,1)
tt2=0:0.0005:0.025;
plot(tt2,F);% impulse responseはフィルターそのもの
xlabel("(sec)") 
title("FIR impulse") 


yF=fft(F,1024);%FIRフィルターのFFT
yFyy=yF.*conj(yF)/1024; # Pyy−スペクトル密度conj−複素共役 
f2=2000*(0:1023)/1024;

subplot(2,1,2)
f2=2000*(0:1023)/1024;
plot(f2,yFyy(1:1024));
xlabel("(Hz)") 
title("FIR Frequency response");

fout=conv(ze,F); %zeはオーバーサンプリング2倍した前述のデータ FはFIRフィルター
figure
subplot(2,1,1)
tt3=0:0.0005:0.5365;
plot(tt3,fout)
axis([0 0.05 -60000 60000]);
xlabel("(sec)") 
title("FIR output(time domain)");

fyF=fft(fout,1024);
fyFyy=fyF.*conj(fyF)/10241; # Pyy−スペクトル密度conj−複素共役 
subplot(2,1,2)
plot(f2,fyFyy(1:1024));
xlabel("(Hz)") 
title("FIR output(frequency domain) ");
 

4、FIRフィルタ(オーバーサンプリング・フィルタ)

(1)インパルス・レスポンスがFIRフィルタ係数になる。(FIRフィルタを設計するということは、インパルス応答を計算することと等価になります)
(2)インパルス応答の形状にはタップ数Nの偶奇により4つに分類される。奇対称なインパルス応答を持つFIRフィルタはヒルベルト・フィルタが構成できる。
使用したプログラムは3、オーバーサンプリングの項(最終行付近)に記載してます。
FIRフィルタの係数ベクトル
F=[8;0;24;0;58;0;-120;0;221;0;-380;0;619;0;-971;0;1490;0;-2288;0;3649;0;-6628;0;20750;32768;20750;0;-6628;0;3649;0;-2288;0;1490;0;-971;0;619;0;-380;0;221;0;-120;0;58;0;-24;0;8];
インパルス応答はplot(F)、周波数特性はFFTしてみます。オーバーサンプリング・フィルタの特性になってます。

FIR filter

次に、先のFIRフィルターに3、オーバーサンプリングで作った信号U(X2 over samppling)を入力してみます。波形が滑らかになり、いらない周波数成分(図の真ん中付近4本が取り除かれます)
ここでレスポンスはUとFのたたみこみconv(U,F)で求まります。たたみこみとは多項式の乗算です。octaveではfilterという関数が用意されていますのでどちらを使ってもかまわないでしょう。

FIR filter

比較のため、もとの波形を再度載せておきます(下図)。

OverSamppling

5、デシメーション

サンプリング・レートを落とす作業です。単に間引くだけではエイリアスが発生しますので、あらかじめエイリアスが発生する範囲をFIRフィルタで取り除き、その後間引きます。
高速にデシメーションフィルタを実行する場合FIRフィルタでは速度が間に合わない場合があります、特にゼロIFでダイレクトコンバージョンする場合です。その場合はsincフィルタを用います。その実施例は18、復調に使う複素ミキサの項で行ってます。
octaveの関数では下記があります。
usage: y = decimate(x, q [, n] [, ftype])
y = decimate(x,4); % factor of 4 decimation
または y = downsample(x,n)がありますが、確認はしていません。

6、SINC関数(フィルタ)

(1)sinc関数は、sinc(r)=sinπr/(πr) または sinc(x)=sinx/xであらわされる関数。
(2)これは0次ホールド特性を表わしている。
(3)SINCコムフィルタは1/M・(1−z-M)/(1-z-1)で表すようです。出力y[n],入力u[n]とすれば、y[n] = y[n-1]+(u[n] - u[n-M])/Mとなるので、これは移動平均フィルタとも呼ばれてます。M個の単純移動平均と同じです。
(4)逆SINC関数、サンプリング遅れを補正するため使われます。1/(1 - z-1 )となるので、y[n] = u[n] + y[n-1]
このスペクトラム例は18、復調に使う複素ミキサの項に示してます。
またSINCフィルタをカスケード接続する場合は、特別な方法のCICフィルタが用いられてます。CIC(Cascaded Integrator-Comb)は積分器や微分器を集めて段数を減らすなど工夫されてます。
octaveに用意されているsinc関数があります。
戻り値にはpiが含まれていることに注意します。
	File: sinc (x)
	Return sin(pi*x)/(pi*x). 
 

7、0次ホールド特性

D/A変換した時に0次ホールドのフィルタ特性が含まれてしまい、周波数特性が劣化します。0次ホールドによる振幅劣化はアパーチャ効果と呼ばれている。
(1)0次ホールドの伝達関数は Gh(s)={1-exp(-sT)}/s  :sはラプラス演算子 
(2)ゲインは|sinπ(f/fs)/(πf/fs)|/fs、 :fsはサンプリング周波数
(3)Z変換で表すと(z - 1)/z = 1 - z-1
(4)離散化方程式で現わすと出力y[n],入力u[n]として、y[n] = u[n] - u[n-1])
(5)連続系の伝達関数を0次ホールドで離散化することはよく行われる。
例えばc2d(sys,t)関数は連続時間系から離散時間系への変換であるが、このとき0次ホールドを用いるて離散化する(指定できる)。

8、ポリフェーズ・フィルタ

・もとのフィルタ係数を等間隔に取り出しフィルタ・バンクに展開した構造。
・フィルタの計算時間をサンプリング時間で均等に割り振ることが可能。
・消費電力削減、回路規模削減が可能になります。
詳しくは Blackfinさん Klabさんなどのサイト掲載されてました。 FIRフィルターをポリフェーズ分解(変換)することによってポリフェーズ・フィルタを作ることができます。

octaveで関連する関数が用意されています。 [y h]= resample(x,p,q), y = resample(x,p,q,h)
「Change the sample rate of x by a factor of p/q. This is performed using a polyphase algorithm. The impulse response h of the antialiasing filter is either specified or either designed with a Kaiser-windowed sinecard」

ノーブル恒等変換
ポリフェーズフィルタはポリフェーズ変換とノーブル恒等変換が組み合わせて使われています。ノーブル変換は下記の等価変換のことです。 アップサンプリングの場合を例にとると、アップサンプラの前にある信号処理段H(z)が、アップサンプラの後ろに移動された場合、その処理がH(zL )になります。

ダウンサンプリング
x(n)→ ↓M → H(z)→y1(n) ⇔ x(n)→ H(zM) → ↓M →y1(n) は等価

アップサンプリング
x(n)→ H(z) → ↑L → y2(n) ⇔ x(n)→ ↑L → H(zL ) →y2(n) は等価

ポリフェーズ分解

9、ナイキスト・フィルタ

周波数の有効利用のため信号(シンボル)の帯域制限を行う必要がありますが、送信データの情報を失わないための帯域制限の条件(ナイキスト基準)、およびその条件を満足するフィルタ(ロールオフフィルタ)が重要になってきます。

(1) T秒ごとに標本化された標本をフィルタを通したとき,出力波形のT秒ごとの標本値が元の値と完全に等しくなるようなフィルタである。T(sec)毎の入力波形の情報は出力側で維持されているので、この状態を零符合間干渉(零ISI:零Inter-Symbol Interference)と呼ばれ、このフィルタがナイキストフィルタです。
(2) 単一キャリア変調信号の場合のサイドローブ制限などに使われてます。
(3) 理想フィルタは実現困難であるため、ナイキスト2乗余弦フィルタが良く用いていて、シンボル・クロック周波数のちょうど半分の周波数を境に、左右が奇対称の周波数特性を持つフィルタになる。
(4) しかしオーバーシュートやアンダーシュートが普通に発生し振幅特性が暴れる。
(5) 上記理由によりロールオフ・フィルタが必要になる。
Matlabを使えばコサインロールオフ・フィルタ設計ツール 関数rcosineが付いているようですので、Matlabに譲ったほうがよさそうです。 

参考Webサイト1.MATLAB 音声信号処理
ナイキストフィルタのインパルス応答として一例としてsinc関数があります。ナイキストフィルタを作る場合は、アナログのsinc関数のインパルス応答(Fig.1)をサンプリング周波数fsでサンプリングした値(Fig.2)をフィルタとして利用します。
ここでは
サンプリングレートが1であるディジタル信号の利用のために、シンボルレート0.25のナイキストフィルタです。カットオフ周波数は0.125付近になってますが、振動的で、オーバーシュート、アンダーシュートが起こりそうです。
補足:sinc(x)=sin(πx)/(πx)で表せますから、xが整数ならsinc(πx)=0になりそうです、うまくいけばナイキストフィルタが成り立ちます。

注意点ですが、octaveのsinc関数はsinc(x)=sin(pi*x)/(pi*x)です。piがあらかじめ入ってます。

Fig.1はsinc関数のインパルス応答、Fig.2はfs=0.25で作ったナイキストフィルタです。

nyquist

Fig.3は、フィルタの周波数応答です。カットオフ周波数は0.125付近になってます。

nyquist

figure(1)
x=(-4:0.1:4);

y=sinc(x);
subplot(2,1,1), plot(x,y); 
xlabel("(Time)") 
title("Fig.1  nyquist impulse sinc(x)") 
grid "on";

fs=1;%hz
x2=(-4:0.25:4);%msec

y2=sinc(fs*x2);
subplot(2,1,2), plot(x2,y2,"*"); 
xlabel("(Time)") 
title("Fig.2 nyquist impulse sinc(fs*x) fs=1Hz x=0.25step") 
grid "on";

figure(2);
FTP=128;
yf=fft(y2,FTP);

YF=yf.*conj(yf)/FTP; # Pyy−スペクトル密度conj−複素共役 
f2=1*(0:FTP-1)/FTP;
subplot(2,1,1);
plot(f2,(YF));
xlabel("(time)") 
title("Fig.3 Frequency response ,fs=1Hz")
xlabel("(Frequency)") 
次に、ロールオフフィルタはどうなるのでしょうか、Matlabの例題で確認です
サンプリングレートが1であるディジタル信号の利用のために、サンプリングレート2のルートコサインFIRロールオフフィルタを設計します。
num = rcosine(1,2,'fir/sqrt')
num =
  Columns 1 through 7 
    0.0021   -0.0106    0.0300   -0.0531   -0.0750    0.4092    0.8037
  Columns 8 through 13 
    0.4092   -0.0750   -0.0531    0.0300   -0.0106    0.0021
ここで、ベクトルnumは、z-1のべきの昇順にフィルタの係数を含みます。

はどうなるでしょうか
FI=[ 0.0021   -0.0106    0.0300   -0.0531   -0.0750    0.4092    0.8037 0.4092   -0.0750   -0.0531    0.0300   -0.0106    0.0021];
Fig.4, Fig.5のようになります。

nyquist

10、ヒルベルト変換

取り込んだ実信号から、虚数部の信号を作り出すことをヒルベルト変換という。フーリエ変換した後、それぞれのスペクトラムの位相を正周波数の複素正弦波に対してー90°移相させ、負周波数の複素正弦波に対しては+90°移相させます。それをフーリエ逆変換すると虚数部の信号が得られます。DC成分は位相の概念がありませんから、あらかじめDC成分はゼロとします。

 実際にはフーリエ変換を2回も実行するのは処理が重たいので、フーリエ変換しない方法が提案されてます。

シミュレーションならばhilbert(x),hilbert(x,n)関数が便利です。

11、ターボ符号

符号化/復号化方式の一種。誤り訂正能力が高い。 単純なビタビ復号による畳み込み符号(エラー訂正符号)は、シャノン限界に迫る性能を発揮するターボ符号の要素として使われている。
次世代の携帯電話や無線LANでは、誤り訂正符号として、ターボ符号を超えてシャノンの理論限界に迫る特性を持つ低密度パリティ検査(LDPC)符号が注目されている。

CTC(畳みこみターボ符号)
CC(畳みこみ符号)
BTC(Block Turbo Cording)

参考文献
(1)畳み込み符号
(2) 設計仕様書 (2000/9/19版)

12、直交変換(変調)

入力信号に対して直交したSIN/COSの位相関係のキャリア(直交キャリア)にそれぞれ同期した信号を取り出すことが可能です。これを直交変換といいます。 90度位相差のある直交キャリアを用いて復調すると、ある信号に対して独立した2つの信号成分を得ることができます。PSK,QAMなどの位相変調、復調はこの考えに基づいています。

直交変調
I信号ーー>*(掛ける)cosーー>@
Q信号ーー>*(掛ける)sinーー>A 
 直交変調信号は@+A QPSK, QAMなど

直交復調
入力信号ーー>*(掛ける)cosーー>B I成分
入力信号ーー>*(掛ける)sinーー>C Q成分

RF信号をダイレクト(IF(中間周波数)なし、ゼロIF)に復調するような場合は、のちに述べる 複素ミキサ が必要になります。直交復調だけではIFが必要になってしまいます。

13、直交キャリア

キャリア同士が直交であるということ、相互相関がゼロである関数である。例えばSIN/COSは90度位相差のある直交したキャリアといえます。代表的にはOFDMの場合が当てはまります。そこでは直交関数(ここではフーリエ変換)を使って変調していて、各々のサブキャリアが直交関係にあります。

直交関数について復習します。相互相関がゼロ、畳みこみがゼロということですが、フーリエ変換された信号はフーリエ級数 ejωt+ej2ωte+j3ωt+・・・式@で表されます。ここでcoskxとsinlx (k,l=1,2,3...)は[-π,π]で直交関係にあるということで式@の各々の項同士の畳みこみはゼロになるような気がします(実際にゼロになります、例えばejωtとej2ωtの畳みこみがゼロ)。従ってフーリエ変換は直交関数になります。

他の直交関数にDCT(コサイン変換)があります。フーリエ変換とは違って積分区間を2πからπに改め、cosだけで寄関数を表現している。関数はdct(x)があります。

14、変調電力効率

15、線形変調/位相(非線形)変調

[線形変調] AM(振幅変調)のように変調後のベースバンド成分のスペクトラムがキャリア周波数に平行移動する変調方式。QPSKやQAMも線形変調です。直交する二つのキャリア信号でAM変調かけて加算して作り出しているからです。(直交変調における位相変調はAM変調であるということになります)。
[位相変調] 位相変調(PM)と周波数変調(FM)は非線形変調。FM変調は振幅が一定のため、非線形なC級アンプをなどを用いて出力しても問題なく、電力効率にとっては有効な手段である。
参考文献(2)P202

16、シンボル同期

17、スミア変換

18、復調に使う複素ミキサ、デシメーション

(1)複素正弦波は+ωcまたは、-ωcの単一スペクトラムになり、複素ミキサではキャリアωcによって周波数変換された単一の信号しか出てこない(-ωcまたは+ωc)。
(アナログミキサでは±ωc二つの信号ができてしまう)
(2)複素ミキサではマイナスの信号も取りうるので、ゼロで折り返しが発生しない。従ってIF周波数をゼロにすることができる(ゼロIF)
(3)複素ミキサへの入力は複素信号なのであらかじめ直交復調でパスバンド複素化します。

 パスバンド複素化( 直交復調 )
入力信号ーー>*(掛ける)cosーー> xi I成分
入力信号ーー>*(掛ける)sinーー> xq Q成分

(4)参考文献2のp97には複素ミキサの詳細が載ってます。それによりますと
入力 xi,xq 出力 y = yi+ i*yq
yi=cos(ωt)*xi-sin(ωt)*xq
yq=sin(ωt)*xi+cos(ωt)*xq
ここでωが負の場合は
yi=cos(ωt)*xi+sin(ωt)*xq
yq= -sin(ωt)*xi+cos(ωt)*xq となります。
(4)実際にはsin,cos信号を作るために、NCO(数値制御発信器)が用いられている。

 これをシミュレーションで確認してみます。以下に確認結果を示します。

 [入力信号] Fig1は入力信号スペクトラムとします。4本のスペクトラムがあります。レベルをわざと違うようにして、スペクトラムの区別ができるようにしておきます。中心より左側の2本のスペクトラムは正の周波数を表わし、右側の2本のスペクトラムは負の周波数を表しています。

 [UP conversion 直交変調] Fig2はFig1の入力信号をIF(4KHz)で変調(UP conversion)したものです。IF(4KHz)より低いほうに負の周波数成分、高いほうに正の周波数成分のスペクトラムがIF付近に集まります。

 [シミュレーションでの注意点]は、入力信号とIF信号のサンプリング周期を合わせることです。共に16KHzサンプリング周期になるように、入力信号をオーバーサンプリング(D/Aコンバータを想定し0次ホールドでオーバーサンプリング)して、16KHzサンプリンにし、いらないスペクトラムを除くためにFFTをかけスペクトラム上でオーバーサンプリングをデータを作りました。その信号を入力信号としています。

複素ミキサ

[ゼロIF] Fig3はFig2での変調信号を複素ミキサを用いて、IF信号をゼロにしてみます(つまり復調)。Fig1と同じようなスペクトラムが得られているということで、複素ミキサによるゼロIFがうまく行えたことになります。ただしサンプリング周波数が異なりますので、この後にデシメーションは必要です。

複素ミキサ

それではデシメーションをSINC関数(フィルタ)で行ってみます。SINCコムフィルタは1/M・(1−z-M)/(1-z-1)で表せます。

 計算上の注意点は、Octaveでのzのべき乗の並べ方です。zのべき乗の降順に並べて計算するのが標準です。これに従いますと、SINCコムフィルタは
(zM-1)/(MzM-MzM-1)
M=8の場合を考えて、Octaveで伝達関数tfを計算し周波数特性を書いてみます。参考文献(2)90ページを参考にしてます。

sys=tf([1 0 0 0 0 0 0 0 -1],[8 -8 0 0 0 0 0 0 0],0.0000625)
fw=(0:10:(32000-1)*pi);%16kHz 2*1600=3200
[gain phase] = bode(sys, fw);
gain_db = 20*log10(gain);
subplot(2,1,1);  
fss=(0.5/pi:5/pi:1600); % f=0.5/pi
plot(fss,gain_db);
title("Fig.4  SINC filter M=8");
ylabel("dB");
xlabel("Frequency(Hz)") ;
axis([1 16000 -70 0]);
 

[SINCフィルター] Fig4はM=8の場合の利得周波数特性を示します。octaveで計算すると周波数軸は(rad/sec)になるようですので(Hz)に変換します。またSINCフィルターは多段で使うようですがここでは確認だけですので1段だけです。FIRローパスフィルタなども必要なようですがここでは挿入しておりません。 参考文献(2)P89

SINCfilter

[Filter関数の使い方] Fig3 の時間領域のデータ(ここではy_i)を先ほどのSINCフィルターに通す場合はFilter関数を使います。入力ベクトルy_iに対してフィルタリングを行った結果をyに出力します。
filter関数をつかっての計算方法は(MM=8)、
      A=[MM -MM 0 0 0 0 0 0 0];
      B=[1 0 0 0 0 0 0 0 -1];
      y1=filter(B,A,y_i);
 
[デシメーションで復調完了] Fig5はデシメーション結果です。Fig1のスペクトラムに復調されているのが確認できました。ただしスペクトラム強度は異なるため、調整が必要なようです。

19、PN符号、M系列、Gold系列

スペクトル拡散通信やCDMAに用いられる拡散符号系列は、疑似ランダム系列(PN(pesude noise)系列)です。PN系列のうちM系列とGold系列がよくつかわれ、Gold系列はCDMA通信システムに使われている。 CDMA(Code Division Multiple Access)
MatlabにPNシーケンス信号作成の例題 out = pnsamp1(init,poly,number) がありますが、これはM系列で、フィードバックタップの位置は110(すべてのフィードバックの場合は1FF、先頭は出力側)のようです。9ビットのPN系列(PN9)(シリアル通信の測定に使われる)です。
 
 PN9の場合の例
init = [1 1 1 1 1 1 1 1 1];	% シフトレジスタの初期状態量
poly = [1 0 0 0 0 1 0 0 0 1];	% フィードバック回路(多項式)
number = 51;			% PNシーケンス信号の長さ

out = pnsamp1(init,poly,number); % PNシーケンス信号作成
では15ビットのPN系列はどうするのでしょうか。またPNシーケンス信号の長さは,測定フレーム長などから決めるようです。
 
 PN15の場合の例
init = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];	% シフトレジスタの初期状態量
poly = [1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1];	% フィードバック回路(多項式) 0x6000
number = 32767;			       % PNシーケンス信号の長さ

out = pnsamp1(init,poly,number); % PNシーケンス信号作成

/// pnsamp1 //Matlab の例題 ///////////////
r=init;
g=poly;

br = zeros(1,length(r));
for t=1:number
    br(1) = mod(r*[g(2:end)]',2);
    br(2:end) = r(1:end-1);
    out(t) = r(end);
    r = br;
end

参考文献
(1)M系列、Gold系列について
(2) 設計仕様書 (2000/9/19版)
(3) 自作 M-file
(4)疑似ノイズジェネレータ

20、ビタビ復号

誤り検出訂正手法。復号方式の一つ。畳み込み符号の復号によく用いられる。ビット・エラーがあっても前後のビットから推定して誤りを訂正する。
 参考文献
 (1)ビタビ・アルゴリズム
 (2)Viterbi アルゴリズム
 

21、PSK,QPSKデジタル変調

y=pskmod(x,M)という関数が用意されている。

22、QAMデジタル変調

y = qammod(x,M)という関数が用意されています。Matlabと違ってmode(gray codeやbinary)の指定ができません。仕方ないので変調信号に無理やりgray codeをマッピングしてみます。64QAM変調です。gray codeでマッピングされたように見えます。
  
M=64;
x = [0:M-1];
y = qammod(x,M); %64QAM

%grey codeが指定できないので無理やりマッピングする。
ip = [0:7]; % decimal equivalent of a four bit binary word
opL = bitxor(ip,floor(ip/2)); % decimal equivalent of the equivalent four 
opM = opL*sqrt(M); 

hold on; % 注釈を同じ図に置く
scatterplot(y,1,0,'b.'); % 
legend 64QAM;

%変調信号yにマッピングする配列opを作る
n=0;
for c=1:sqrt(M)
   for l=1:sqrt(M)
	n=n+1;	
	op(n)=opL(c)+opM(l);
   endfor	
endfor
% 点に番号を付ける
for jj=1:length(y)
  text(real(y(jj))+0.15,imag(y(jj)),dec2bin(op(jj)));
endfor
title('Constellation for Gray-Coded 64-QAM');
hold off;  
  

64QAM

23、CDMA

24、OFDM

OFDMの文献をよく見かけるようになりました。トラ技(参考文献3)にも連載記事が始まってますので、詳細はそちらに期待したいと思います。
  なぜOFDMなのか?そのエッセンスが参考文献(4)に記されていました。2つあります。
(1)信号の低速化
周波数選択性フェージングはデータ伝送速度が低い信号には影響がない。
なるほど、OFDMはサブチャンネルに信号をのせて送りますが、そのサブチャンネルの伝送速度は低いのです。例えば、1000のサブチャンネルがあり、50Mbpsの伝送をする場合、1つのサブチャンネルは50/1000=50Kbpsでいいのです。
(2)信号の並列化
データの高速伝送を行うため、異なる周波数で同時に並行して伝送する。全体として高速伝送になります。
ということですが、そのためには直交変換関数(FFT)を使って処理していきます。

本サイトでも、PICマイコンを使ってOFDMのまねごとをしようとしています。使用したdsPICにはFFT/IFFT関数が用意されていますので使ってみました。またこちら(Octave_MIMO)ではもう少し踏み込んでいます。

参考文献
(1)酒井 幸市「ディジタル画像処理の基礎と応用」CQ出版社 2007年 
(2)西村 芳一「ディジタル信号処理による通信システム設計」CQ出版社 2006年
(3)石井 聡 「図解 OFDMのしくみ」トランジスタ技術 2009.2月、3月〜短期連載
(4)神谷 幸宏「MATLABによるディジタル無線技術」コロナ社 2008年