Scilab で SSB 信号を作る [Simulation]
Scilab で SSB 信号を作ってみました。 変調方式は PSN です。 時間は離散時間ですが、振幅の量子化はしていません。 int16() 関数とかを使えば良いのですが、それは次の機会にトライしてみます。 (subplot()関数を使ってグラフの表示内容を増やしました)
〔信号波形〕
シミュレーションした条件は
① AF 信号: 1000Hz + 1700Hz
② キャリヤ: 64kHz
③ サンプリング: 512kHz
で、得られた SSB 信号はこれです。
上から、Two Tone 信号、キャリヤ、I信号、Q信号、SSB 出力です。
〔プログラム〕
π/2 のフェーズシフターにはヒルベルト変換をそのまま使ってしまっています。 本来は hilb() 関数でヒルベルト・フィルタの係数を計算し、それぞれの信号をヒルベルト・フィルタに通して計算した方が実際に近いです。 まだ subplot() 関数がうまく使えていないので、出力の波形は一つだけです。 ← 使ってみました。
// PSN SSB simulation with Two Tone AF signal
// AF signal
// 1000Hz + 1700Hz
// Carrier siganl
// 64kHz
// Sampling frequency
// 512kHz
// simulation time
// T sec
afreq1 = 1000;
afreq2 = 1700;
cfreq = 64000;
sf = 512000;
taps = 511;
a1 = 0.1; // amplitude
a2 = 0.1;
ac = 0.8;
T = 1/sf; // calculate sampling period
while(1)
printf('\n');
st = input('input simulation time [Sec] (zero is exit) ??');
if st == [0] then break end;
// calculate the number of sampling points
sp = st * sf;
k = 1:sp;
// Two Tone AF signal
af1 = a1*sin(2*%pi*afreq1*k*T);
af2 = a2*sin(2*%pi*afreq2*k*T);
af = af1 + af2;
subplot(5,1,1);
plot(af, 'r');
// carrier signal
cf = ac*sin(2*%pi*cfreq*k*T);
subplot(5,1,2);
plot(cf, 'g');
// Hilbert Filter
hf = hilb(taps);
// calculate I
I = af .* cf;
subplot(5,1,3);
plot(I, 'c');
// calculate Q
afi = imag( hilbert(af) ); // pi/2 shifter
cfi = imag( hilbert(cf) ); // pi/2 shifter
Q = afi .* cfi;
subplot(5,1,4);
plot(Q, 'm');
y = (I + Q)/2;
subplot(5,1,5);
plot( y, 'b' );
yfft = fft( y );
// plot( yfft );
end
〔信号波形〕
シミュレーションした条件は
① AF 信号: 1000Hz + 1700Hz
② キャリヤ: 64kHz
③ サンプリング: 512kHz
で、得られた SSB 信号はこれです。
上から、Two Tone 信号、キャリヤ、I信号、Q信号、SSB 出力です。
〔プログラム〕
π/2 のフェーズシフターにはヒルベルト変換をそのまま使ってしまっています。 本来は hilb() 関数でヒルベルト・フィルタの係数を計算し、それぞれの信号をヒルベルト・フィルタに通して計算した方が実際に近いです。 まだ subplot() 関数がうまく使えていないので、出力の波形は一つだけです。 ← 使ってみました。
// PSN SSB simulation with Two Tone AF signal
// AF signal
// 1000Hz + 1700Hz
// Carrier siganl
// 64kHz
// Sampling frequency
// 512kHz
// simulation time
// T sec
afreq1 = 1000;
afreq2 = 1700;
cfreq = 64000;
sf = 512000;
taps = 511;
a1 = 0.1; // amplitude
a2 = 0.1;
ac = 0.8;
T = 1/sf; // calculate sampling period
while(1)
printf('\n');
st = input('input simulation time [Sec] (zero is exit) ??');
if st == [0] then break end;
// calculate the number of sampling points
sp = st * sf;
k = 1:sp;
// Two Tone AF signal
af1 = a1*sin(2*%pi*afreq1*k*T);
af2 = a2*sin(2*%pi*afreq2*k*T);
af = af1 + af2;
subplot(5,1,1);
plot(af, 'r');
// carrier signal
cf = ac*sin(2*%pi*cfreq*k*T);
subplot(5,1,2);
plot(cf, 'g');
// Hilbert Filter
hf = hilb(taps);
// calculate I
I = af .* cf;
subplot(5,1,3);
plot(I, 'c');
// calculate Q
afi = imag( hilbert(af) ); // pi/2 shifter
cfi = imag( hilbert(cf) ); // pi/2 shifter
Q = afi .* cfi;
subplot(5,1,4);
plot(Q, 'm');
y = (I + Q)/2;
subplot(5,1,5);
plot( y, 'b' );
yfft = fft( y );
// plot( yfft );
end
コメント 0