スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

途中まで

clear
delete("all")
clf()


TMP_D = "C\scilab_works\det_filter";
FILE_NAME = "test.txt";

//////////////// 共通パラメータ ///////////////////////////////////////////////////

FREQ_SAMP_ADC = 1000; //ADCサンプリングレート〔MHz〕


CAL_TIME = 20; //解析時間〔us〕◆ただし、FFTポイント数のため、2^Nへ変換している


TAP_NUM = 32; //フィルターのタップ数
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////
// LPF
///////////////////////////////////////////
[wft,wff,fr]=wfir('lp',TAP_NUM,[0.25 0],'hn',[1 0]); //wft:インパルス応答、wff:周波数応答、fr:周波数グリッド

figure(0)
subplot(121)
title("周波数応答");
plot(fr,wff)
xgrid;

subplot(122)
title("インパルス応答");
plot(0:TAP_NUM-1,wft)
xgrid;

///////////////////////////////////////////
// LPF ⇒ BPF化【入力信号のIQ分離】
// 「考え方①」実信号をIQ分離して、各々LPFへ入力すると考える。
// 「考え方②」実信号を複素BPF(IQそれぞれBPFをもつ)とする。
//
// 【メリット】
// 任意の実信号をLPF(FIR)へ入力した場合・・・
// LPFの動作周波数は、ADCサンプリング周波数と同じである必要がある。
// I成分BPF、Q成分BPFへ信号を2分配して入力した場合・・・
// 各BPF(FIR)の動作周波数は、ADCサンプリング周波数の半分でよい。
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
///////////////////////////////////////////

// e^(-jwn) = cos(wn) - j*sin(wn) , w = π/2とすれば、
// n = 0,1,2,3,4・・・のとき、1,-j,-1,j,1となり、IQが順番に出力されていることになる。
// ただし、"n"はサンプリング数なので、サンプリング周期(1/fs)で「1,-j,-1,j,1」は並んでいる
// IQごとに考えると、I「1,0,-1,0,1」,Q「0,-j,0,j,0」となる。
// つまり、IQを互いに"90度"ずらした"fs/2"で動作させ、最終的に加算すれば同じ結果となる。
// さらに、Iふたつ、Qふたつの計4つをすべて"90度"ずらせば、"fs/4"でよいことになる。

i_shift_def = [1 0 -1 0]; // 4サンプルで1周期とする
q_shift_def = [0 -1 0 1]; // 「i_shift_def」より、90度位相がずれている

I_shift = repmat(i_shift_def,1,TAP_NUM/4); //列方向に長さ拡張
Q_shift = repmat(q_shift_def,1,TAP_NUM/4);

bpf_I = wft .* I_shift; //LPFインパルス応答へシフト量だけ乗算
bpf_Q = wft .* Q_shift; //(時間軸での乗算 ⇒ 周波数軸での畳込み)

//FIR関数が出力するF特の周波数分解能と等しくするため
zeropad_num = size(wff,2)*2 - size(bpf_I,2); //FIR出力がナイキスト範囲なので2倍する
bpf_I = [bpf_I zeros(1,zeropad_num)];
bpf_Q = [bpf_Q zeros(1,zeropad_num)];

fft_bpf_I = abs(fft(bpf_I));
fft_bpf_Q = abs(fft(bpf_Q));

figure(1)
subplot(221)
title("周波数応答 BPF(I成分)");
plot((0:size(bpf_I,2)-1)/(size(bpf_I,2)-1),fft_bpf_I)
//plot((0:TAP_NUM-1)/(TAP_NUM-1),fft_bpf_I)
xgrid;

subplot(222)
title("周波数応答 BPF(Q成分)");
plot((0:size(bpf_Q,2)-1)/(size(bpf_Q,2)-1),fft_bpf_Q,'r')
//plot((0:TAP_NUM-1)/(TAP_NUM-1),fft_bpf_Q,'r')
xgrid;

subplot(223)
title("インパルス応答 BPF(I成分)");
plot(0:TAP_NUM-1,bpf_I(0:TAP_NUM-1))
xgrid;

subplot(224)
title("インパルス応答 BPF(Q成分)");
plot(0:TAP_NUM-1,bpf_Q(0:TAP_NUM-1),'r')
xgrid;

///////////////////////////////////////////
// 入力信号生成
///////////////////////////////////////////
fin = 50;//FREQ_SAMP_ADC * 0.5; // ? MHz
ts = 1/FREQ_SAMP_ADC;
N = 0:1:127;
freq_axis = (FREQ_SAMP_ADC/size(N,2))*N;

Ain = 2*%pi*fin*ts*N; // f*ts*N = (f/fs)*N
Sin = cos(Ain); //入力信号

fft_Sin = abs(fft(Sin));

figure(2)
subplot(121)
title("入力信号");
plot(N,Sin,'.-')
xgrid;

subplot(122)
title("FFT(入力信号)");
xlabel("Freq [MHz]");
ylabel("Power Spectrum")
plot(freq_axis,fft_Sin)
xgrid;

///////////////////////////////////////////
// IQ生成
//  入力信号をIQ分離するため
///////////////////////////////////////////

f = FREQ_SAMP_ADC * 0.125; //IQ周波数は、サンプル周波数 * 定数とする
ts = 1/FREQ_SAMP_ADC;
N = 0:1:127;
freq_axis = (FREQ_SAMP_ADC/size(N,2))*N;

A = 2*%pi*f*ts*N; // f*ts*N = (f/fs)*N
I = cos(A);
Q = sin(A); //(A-%pi*3/2);
amp0 = I + Q;
pow0 = sqrt(I^2 + Q^2);

fft_I = abs(fft(I));
fft_Q = abs(fft(Q));

//fft_RE = real(fft_Q);
//fft_IM = imag(fft_Q);

figure(3)
subplot(121)
title("IQ");
plot(N,I,'.-')
plot(N,Q,'.-r')
xgrid;

subplot(122)
title("FFT(IQ)");
xlabel("Freq [MHz]");
ylabel("Power Spectrum")
plot(freq_axis,fft_I)
plot(freq_axis,fft_Q,'r')
xgrid;


///////////////////////////////////////////
// 入力信号のIQ分離
///////////////////////////////////////////
S_I = Sin .* I; //I分離
S_Q = Sin .* Q; //Q分離
//POW_S_IQ = sqrt(S_I^2 + S_Q^2);


///////////////////////////////////////////
// フィルタ適用 (時間軸での畳込み計算)
///////////////////////////////////////////
conv_I = convol(wft,S_I);
conv_I_len = size(conv_I,2); //畳込みの計算上、(信号長さ - 1) = (畳込み結果の長さ)
conv_Q = convol(wft,S_Q);
conv_Q_len = size(conv_Q,2);

amp = conv_I + conv_Q;
pow = sqrt(conv_I^2 + conv_Q^2);

N2 = 0:size(conv_I,2)-1;
freq_axis_conv_IQ = (FREQ_SAMP_ADC/size(N2,2))*N2;
fft_conv_I = abs(fft(conv_I));
fft_conv_Q = abs(fft(conv_Q));

figure(4)
subplot(121)
title("フィルタと信号の畳込み");
xlabel("N sample");
plot(0:conv_I_len-1,conv_I,'.-')
plot(0:conv_Q_len-1,conv_Q,'.-r')
xgrid;

subplot(122)
title("FFT(convolution)");
xlabel("Freq [MHz]");
ylabel("Power Spectrum")
plot(freq_axis_conv_IQ,fft_conv_I)
plot(freq_axis_conv_IQ,fft_conv_Q,'r')
xgrid;


/////////////////////////////////////////////
//// フィルタ適用 (時間軸での畳込み計算)
/////////////////////////////////////////////
//conv_I = convol(wft,I);
//conv_I_len = size(conv_I,2); //畳込みの計算上、(信号長さ - 1) = (畳込み結果の長さ)
//conv_Q = convol(wft,Q);
//conv_Q_len = size(conv_Q,2);
//
//amp = conv_I + conv_Q;
//pow = sqrt(conv_I^2 + conv_Q^2);
//
//N2 = 0:size(conv_I,2)-1;
//freq_axis_conv_IQ = (FREQ_SAMP_ADC/size(N2,2))*N2;
//fft_conv_I = abs(fft(conv_I));
//fft_conv_Q = abs(fft(conv_Q));
//
//figure(4)
//subplot(121)
//title("フィルタと信号の畳込み");
//xlabel("N sample");
//plot(0:conv_I_len-1,conv_I,'.-')
//plot(0:conv_Q_len-1,conv_Q,'.-r')
//xgrid;
//
//subplot(122)
//title("FFT(convolution)");
//xlabel("Freq [MHz]");
//ylabel("Power Spectrum")
//plot(freq_axis_conv_IQ,fft_conv_I)
//plot(freq_axis_conv_IQ,fft_conv_Q,'r')
//xgrid;
スポンサーサイト

ADCの指標 (SNRとSFDRとDR)


http://www.tij.co.jp/lsds/ti_ja/analog/glossary/snr_sfdr.page

●SNR = (信号電力の実効値) / (雑音電力の実効値) = (ADCフルスケール入力) - (ノイズ成分の総和)
 信号と雑音の実効値の比率のこと。

●SFDR = (ADCフルスケール入力) - (最大スプリアスレベル)
  スプリアスの影響を受けないダイナミックレンジのこと。

●DR = (ADCフルスケール入力) - (平均ノイズフロア)
  スプリアスを考慮していない。


 SFDR > SNR もあり得る。

電力電圧換算


●電力(dBm)から電圧換算
  X dBm = 10LOG(P) ⇒ 電圧実効値(Vrms)における電力値。 Vrms = sqrt(P * R)

●電圧から電力換算
 ①実効値(Vrms) ⇒ P = (Vrms ^2) / R

 ②PP電圧(Vpp) ⇒ P = (Vpp / (2 * sqrt(2) )^2 / R

   ※途中で、ピークトゥーピーク電圧(Vpp)を実効値(Vrms)へ変換している。
     Vpp = 2 * Vamp = 2 * sqrt(2) * Vrms
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。