Arduino勉強会/0M-ソフトウェアラジオその1(AM波)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[Arduino勉強会]]
#contents
2015/06/27からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロー...
http://www15191ue.sakura.ne.jp:8000/home/pub/52/
また、Sageのサーバを公開しているサイト(http://www15191ue...
** ソフトウェアラジオ(Software Design Radio)AMラジオ編 ...
トランジスタ技術別冊トラ技Jr 2015/3.4号に紹介されている「...
*** ブレッドボードで作ったAMラジオ [#rd262b53]
ソフトウェアラジオ(Software Design Radio)AMラジオ編は、...
- [[第1回 パソコンでAMラジオ放送を聴く(補足資料)>ht...
私の作成した「ブレッドボードで作ったAMラジオ」は、以下の...
&ref(th_SoftWareRadio.jpg);
*** Mac用ソフトウェアラジオ・アプリケーション [#z90b2856]
第1回パソコンでAMラジオ放送を聴く」で紹介されているソフト...
SDRadio.exe ver.0.99というWindows用のアプリです。
私は、Mac OSXを使っているので、Mac用のソフトウェアラジオ...
今回「ブレッドボードで作ったAMラジオ」の再生用に使ったの...
[[Dream 1.11>http://dl2sdr.homepage.t-online.de/]]
です。
Dreamを起動し、入力をマイクとし、DemodulationをAMにし、15...
次にFilter Bandwidthを5kHz程度にするとラジオの放送が聞こ...
&ref(th_dream.jpg);
私の住む高岡市で最も電波の強い放送局は北日本放送(738kHz...
Dreamで受信した北日本放送は、以下の様な音でした。音声は小...
- 「ブレッドボードで作ったAMラジオ」で受信した放送の一部 ...
*** 「ブレッドボードで作ったAMラジオ」の構成 [#x8653a57]
「ブレッドボードで作ったAMラジオ」の構成を回路をトラ技Jの...
&ref(Fig_1.png);
ブレッドボードで処理しているのは、同調・講習は増幅、局部...
どうしてこんな単純なもので、ソフトウェアラジオが聞こえる...
*** 「ブレッドボードで作ったAMラジオ」の回路 [#lb007d79]
「ブレッドボードで作ったAMラジオ」の回路をトラ技Jの図7か...
&ref(th_Fig_7.jpg);
** 「ブレッドボードで作ったAMラジオ」の仕組み [#g284bb15]
第1回 パソコンでAMラジオ放送を聴く(補足資料)の4.1に...
ミキサの原理は、放送波を\(v_{rin} = sin(2 \pi f_r t)\)、...
ミキサーからでる信号は、以下の様になります。
$$
\begin{eqnarray}
v_{mix} & = & sin(2 \pi f_r t) \times sin(2 \pi f_{LO} t...
& = & \frac{1}{2} \left \{ -cos(2\pi(f_r + f_{LO})t) + co...
\end{eqnarray}
$$
つまり、\(f_r - f_{LO}\)の周波数を持つ低い波と\(f_r + f_{...
ローパスフィルターを使って高い波を取り除くと、\(f_r - f_{...
これが、ミキサによる周波数変換のマジックです。
ミキサの原理を第1回 パソコンでAMラジオ放送を聴く(補...
&ref(Fig.A_14.png);
AM波では、バンド幅を15kHzとしているので、北日本放送(738k...
「ブレッドボードで作ったAMラジオ」の発振モジュール(秋月...
&ref(freq.png);
** Sageを使ってAM変調試す [#w7c37f1f]
実際にAM放送の信号が局部発振波(ここではsin波)を使ったミ...
Sageを使って見てみましょう。
最初によく使う関数(Rutil.py)をロードします。
sageへの入力:
#pre{{
# R用のユーティリティーをロードする(showPNGで使用)
load(DATA+'RUtil.py')
}}
*** 搬送波 [#g6ffb996]
周波数が100kHz(北日本放送ではこれが738kHzです)で振幅1の...
sageへの入力:
#pre{{
t= var('t')
Tend = 0.002
fc = 100000 # 100kHz
Vcm = 1.0
Vc(t) = Vcm*sin(2*pi*fc*t)
plot(Vc(t), [t, 0, Tend], figsize=5)
}}
&ref(sage0.png);
*** 音声として2kHzのcos波 [#y542c70f]
次に音声の代わりに2kHzのcos波をVs(t)と定義し、プロットし...
sageへの入力:
#pre{{
fs = 2000 # 2kHz
Vsm = 0.25
Vs(t) = Vsm*cos(2*pi*fs*t)+0.75
plot(Vs(t), [t, 0, Tend], figsize=5, ymin=0)
}}
&ref(sage1.png);
*** AM変調 [#qa0357c8]
WikipediaによるとAM変調は、以下の様に定義されています。
$$
v_{am} = (V_s + V_{cm})sin 2\pi f_c t
$$
定義にそってAM変調された波をVam(t)を定義し、プロットしま...
AM変調では、上下のエンベロープ(信号の端の形)に音声信号...
sageへの入力:
#pre{{
Vam(t) = (Vs(t) + Vcm)*sin(2*pi*fc*t)
plot(Vam(t), [t, 0, Tend], figsize=5)
}}
&ref(sage2.png);
** 局部発振とのミキサ [#yafeeef5]
搬送波+15kHzの局部発振のsin波とVam(t)と掛け合わせると、以...
見えてきます。
sageへの入力:
#pre{{
band = 15000 # 15kHz
Vcros(t) = Vam(t)*sin(2*pi*(fc+band)*t)
plot(Vcros(t), [t, 0, Tend], figsize=5)
}}
&ref(sage3.png);
*** AM波の復調 [#x6396969]
AM変調の復調には、ミキサされた信号を絶対値absを使って片方...
これで、音声の2kHzの形がぼんやり見えてきます。
sageへの入力:
#pre{{
plot(abs(Vcros(t)), [t, 0, Tend], figsize=5)
}}
&ref(sage4.png);
*** ローパスフィルターを掛ける [#o8acfd4c]
scipyを使ってローパスフィルター(butter_lowpass_filter関...
sageへの入力:
#pre{{
# scipyを使う準備
import numpy as np
from scipy.signal import butter, lfilter, freqz
import matplotlib.pyplot as plt
}}
sageへの入力:
#pre{{
# ローパスフィルターを定義
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='low', anal...
return b, a
def butter_lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
}}
*** サンプリングとフィルタリング [#d348b95f]
サンプリングレートは、96kHzとし、ローパスフィルターのカッ...
sageへの入力:
#pre{{
# フィルターの仕様を決定
order = 6
fs = 96000.0 # サンプリングレート( 96kHz)
cutoff = 4000.0 # カットオフ周波数( 4kHz)
}}
sageへの入力:
#pre{{
# scipyを使ってローパスフィルターを掛けるため、96kHzでサ...
T = Tend
n = int(T*fs)
t = np.linspace(0, T, n, endpoint=False)
# データを作成
data = [abs(Vcros(t_i)).n() for t_i in t]
}}
ローパスフィルタを掛けた結果yとサンプリングデータdataをプ...
緑のフィルター後の波形に2kHzの波が取り出されています。
sageへの入力:
#pre{{
# dataにローパスフィルターを掛けて、オリジナルデータとフ...
y = butter_lowpass_filter(data, cutoff, fs, order)
plt.figure()
plt.plot(t, data, 'b-', label='data')
plt.plot(t, y, 'g-', linewidth=2, label='filtered data')
plt.xlabel('Time [sec]')
plt.grid()
plt.legend()
plt.savefig(DATA+'LPF.png')
}}
sageへの入力:
#pre{{
showPNG('LPF.png')
}}
&ref(th_LPF.jpg);
** スイッチによる方形波 [#y61638a8]
局初のスイッチによる方形波をPiecewise使って以下の様に定義...
奇数倍の周波数のsin波の足し合わせになっていることがわかり...
sageへの入力:
#pre{{
# 方形波が周波数が奇数倍のsin波を足し合わせたもの
# フーリェ級数の係数を求めます。
g = Piecewise([[(-1/2,0), lambda x: 1], [(0, 1/2),lambda ...
plot(g, figsize=5)
}}
&ref(sage5.png);
\(v_{LO}\)は、以下の様になります。
$$
v_{LO} = \frac{1}{2} + \frac{2 \,
\sin\left(2 \, \pi x\right)}{\pi} + \frac{2 \, \sin\left(...
$$
次数を変えて、フーリェ級数で表される方形波をみてみましょ...
値が急に変わる不連続点では急な盛り上がりがでます。これは...
sageへの入力:
#pre{{
# フーリェ級数
show(g.fourier_series_partial_sum(7,1/2))
}}
&ref(eq1.png);
sageへの入力:
#pre{{
p = plot(g.fourier_series_partial_sum(5, 1/2), -1,1, colo...
p += plot(g.fourier_series_partial_sum(11, 1/2), -1,1, co...
p += plot(g.fourier_series_partial_sum(31, 1/2), -1,1, co...
p.show(figsize=5)
}}
&ref(sage6.png);
入力波が\(v_{Rin} = V sin(2\pi f_{Rin} t)\)とすると、以下...
$$
\begin{eqnarray}
v_{mix} & = & v_{Rin} \times v_{LO} \\
& = & \frac{V}{2} sin(2 \pi f_{Rin} t) + \frac{V}{2\pi} \...
\end{eqnarray}
$$
** コメント [#jc8f167a]
#vote(おもしろかった[4],そうでもない[1],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。勉強会で分から...
スパム防止に画像の文字列も入力してください。
#comment_kcaptcha
終了行:
[[Arduino勉強会]]
#contents
2015/06/27からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロー...
http://www15191ue.sakura.ne.jp:8000/home/pub/52/
また、Sageのサーバを公開しているサイト(http://www15191ue...
** ソフトウェアラジオ(Software Design Radio)AMラジオ編 ...
トランジスタ技術別冊トラ技Jr 2015/3.4号に紹介されている「...
*** ブレッドボードで作ったAMラジオ [#rd262b53]
ソフトウェアラジオ(Software Design Radio)AMラジオ編は、...
- [[第1回 パソコンでAMラジオ放送を聴く(補足資料)>ht...
私の作成した「ブレッドボードで作ったAMラジオ」は、以下の...
&ref(th_SoftWareRadio.jpg);
*** Mac用ソフトウェアラジオ・アプリケーション [#z90b2856]
第1回パソコンでAMラジオ放送を聴く」で紹介されているソフト...
SDRadio.exe ver.0.99というWindows用のアプリです。
私は、Mac OSXを使っているので、Mac用のソフトウェアラジオ...
今回「ブレッドボードで作ったAMラジオ」の再生用に使ったの...
[[Dream 1.11>http://dl2sdr.homepage.t-online.de/]]
です。
Dreamを起動し、入力をマイクとし、DemodulationをAMにし、15...
次にFilter Bandwidthを5kHz程度にするとラジオの放送が聞こ...
&ref(th_dream.jpg);
私の住む高岡市で最も電波の強い放送局は北日本放送(738kHz...
Dreamで受信した北日本放送は、以下の様な音でした。音声は小...
- 「ブレッドボードで作ったAMラジオ」で受信した放送の一部 ...
*** 「ブレッドボードで作ったAMラジオ」の構成 [#x8653a57]
「ブレッドボードで作ったAMラジオ」の構成を回路をトラ技Jの...
&ref(Fig_1.png);
ブレッドボードで処理しているのは、同調・講習は増幅、局部...
どうしてこんな単純なもので、ソフトウェアラジオが聞こえる...
*** 「ブレッドボードで作ったAMラジオ」の回路 [#lb007d79]
「ブレッドボードで作ったAMラジオ」の回路をトラ技Jの図7か...
&ref(th_Fig_7.jpg);
** 「ブレッドボードで作ったAMラジオ」の仕組み [#g284bb15]
第1回 パソコンでAMラジオ放送を聴く(補足資料)の4.1に...
ミキサの原理は、放送波を\(v_{rin} = sin(2 \pi f_r t)\)、...
ミキサーからでる信号は、以下の様になります。
$$
\begin{eqnarray}
v_{mix} & = & sin(2 \pi f_r t) \times sin(2 \pi f_{LO} t...
& = & \frac{1}{2} \left \{ -cos(2\pi(f_r + f_{LO})t) + co...
\end{eqnarray}
$$
つまり、\(f_r - f_{LO}\)の周波数を持つ低い波と\(f_r + f_{...
ローパスフィルターを使って高い波を取り除くと、\(f_r - f_{...
これが、ミキサによる周波数変換のマジックです。
ミキサの原理を第1回 パソコンでAMラジオ放送を聴く(補...
&ref(Fig.A_14.png);
AM波では、バンド幅を15kHzとしているので、北日本放送(738k...
「ブレッドボードで作ったAMラジオ」の発振モジュール(秋月...
&ref(freq.png);
** Sageを使ってAM変調試す [#w7c37f1f]
実際にAM放送の信号が局部発振波(ここではsin波)を使ったミ...
Sageを使って見てみましょう。
最初によく使う関数(Rutil.py)をロードします。
sageへの入力:
#pre{{
# R用のユーティリティーをロードする(showPNGで使用)
load(DATA+'RUtil.py')
}}
*** 搬送波 [#g6ffb996]
周波数が100kHz(北日本放送ではこれが738kHzです)で振幅1の...
sageへの入力:
#pre{{
t= var('t')
Tend = 0.002
fc = 100000 # 100kHz
Vcm = 1.0
Vc(t) = Vcm*sin(2*pi*fc*t)
plot(Vc(t), [t, 0, Tend], figsize=5)
}}
&ref(sage0.png);
*** 音声として2kHzのcos波 [#y542c70f]
次に音声の代わりに2kHzのcos波をVs(t)と定義し、プロットし...
sageへの入力:
#pre{{
fs = 2000 # 2kHz
Vsm = 0.25
Vs(t) = Vsm*cos(2*pi*fs*t)+0.75
plot(Vs(t), [t, 0, Tend], figsize=5, ymin=0)
}}
&ref(sage1.png);
*** AM変調 [#qa0357c8]
WikipediaによるとAM変調は、以下の様に定義されています。
$$
v_{am} = (V_s + V_{cm})sin 2\pi f_c t
$$
定義にそってAM変調された波をVam(t)を定義し、プロットしま...
AM変調では、上下のエンベロープ(信号の端の形)に音声信号...
sageへの入力:
#pre{{
Vam(t) = (Vs(t) + Vcm)*sin(2*pi*fc*t)
plot(Vam(t), [t, 0, Tend], figsize=5)
}}
&ref(sage2.png);
** 局部発振とのミキサ [#yafeeef5]
搬送波+15kHzの局部発振のsin波とVam(t)と掛け合わせると、以...
見えてきます。
sageへの入力:
#pre{{
band = 15000 # 15kHz
Vcros(t) = Vam(t)*sin(2*pi*(fc+band)*t)
plot(Vcros(t), [t, 0, Tend], figsize=5)
}}
&ref(sage3.png);
*** AM波の復調 [#x6396969]
AM変調の復調には、ミキサされた信号を絶対値absを使って片方...
これで、音声の2kHzの形がぼんやり見えてきます。
sageへの入力:
#pre{{
plot(abs(Vcros(t)), [t, 0, Tend], figsize=5)
}}
&ref(sage4.png);
*** ローパスフィルターを掛ける [#o8acfd4c]
scipyを使ってローパスフィルター(butter_lowpass_filter関...
sageへの入力:
#pre{{
# scipyを使う準備
import numpy as np
from scipy.signal import butter, lfilter, freqz
import matplotlib.pyplot as plt
}}
sageへの入力:
#pre{{
# ローパスフィルターを定義
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='low', anal...
return b, a
def butter_lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
}}
*** サンプリングとフィルタリング [#d348b95f]
サンプリングレートは、96kHzとし、ローパスフィルターのカッ...
sageへの入力:
#pre{{
# フィルターの仕様を決定
order = 6
fs = 96000.0 # サンプリングレート( 96kHz)
cutoff = 4000.0 # カットオフ周波数( 4kHz)
}}
sageへの入力:
#pre{{
# scipyを使ってローパスフィルターを掛けるため、96kHzでサ...
T = Tend
n = int(T*fs)
t = np.linspace(0, T, n, endpoint=False)
# データを作成
data = [abs(Vcros(t_i)).n() for t_i in t]
}}
ローパスフィルタを掛けた結果yとサンプリングデータdataをプ...
緑のフィルター後の波形に2kHzの波が取り出されています。
sageへの入力:
#pre{{
# dataにローパスフィルターを掛けて、オリジナルデータとフ...
y = butter_lowpass_filter(data, cutoff, fs, order)
plt.figure()
plt.plot(t, data, 'b-', label='data')
plt.plot(t, y, 'g-', linewidth=2, label='filtered data')
plt.xlabel('Time [sec]')
plt.grid()
plt.legend()
plt.savefig(DATA+'LPF.png')
}}
sageへの入力:
#pre{{
showPNG('LPF.png')
}}
&ref(th_LPF.jpg);
** スイッチによる方形波 [#y61638a8]
局初のスイッチによる方形波をPiecewise使って以下の様に定義...
奇数倍の周波数のsin波の足し合わせになっていることがわかり...
sageへの入力:
#pre{{
# 方形波が周波数が奇数倍のsin波を足し合わせたもの
# フーリェ級数の係数を求めます。
g = Piecewise([[(-1/2,0), lambda x: 1], [(0, 1/2),lambda ...
plot(g, figsize=5)
}}
&ref(sage5.png);
\(v_{LO}\)は、以下の様になります。
$$
v_{LO} = \frac{1}{2} + \frac{2 \,
\sin\left(2 \, \pi x\right)}{\pi} + \frac{2 \, \sin\left(...
$$
次数を変えて、フーリェ級数で表される方形波をみてみましょ...
値が急に変わる不連続点では急な盛り上がりがでます。これは...
sageへの入力:
#pre{{
# フーリェ級数
show(g.fourier_series_partial_sum(7,1/2))
}}
&ref(eq1.png);
sageへの入力:
#pre{{
p = plot(g.fourier_series_partial_sum(5, 1/2), -1,1, colo...
p += plot(g.fourier_series_partial_sum(11, 1/2), -1,1, co...
p += plot(g.fourier_series_partial_sum(31, 1/2), -1,1, co...
p.show(figsize=5)
}}
&ref(sage6.png);
入力波が\(v_{Rin} = V sin(2\pi f_{Rin} t)\)とすると、以下...
$$
\begin{eqnarray}
v_{mix} & = & v_{Rin} \times v_{LO} \\
& = & \frac{V}{2} sin(2 \pi f_{Rin} t) + \frac{V}{2\pi} \...
\end{eqnarray}
$$
** コメント [#jc8f167a]
#vote(おもしろかった[4],そうでもない[1],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。勉強会で分から...
スパム防止に画像の文字列も入力してください。
#comment_kcaptcha
ページ名:
SmartDoc