AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年5月号に掲載

Dependencies:   mbed

Committer:
MikamiUitOpen
Date:
Wed Mar 03 01:20:09 2021 +0000
Revision:
1:32d6e3f7df30
Parent:
0:7a653530c8ce
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:7a653530c8ce 1 //---------------------------------------------------------------------
MikamiUitOpen 0:7a653530c8ce 2 // テスト用 FM 変調信号発生
MikamiUitOpen 0:7a653530c8ce 3 // FM 変調器1の搬送波: 70 kHz,変調信号 440 Hz, 振幅変動: 1 Hz
MikamiUitOpen 0:7a653530c8ce 4 // FM 変調器2の搬送波:130 kHz,変調信号:A1 から入力した信号
MikamiUitOpen 0:7a653530c8ce 5 // 出力
MikamiUitOpen 0:7a653530c8ce 6 // A2 :FM 変調波
MikamiUitOpen 0:7a653530c8ce 7 // D13:FM 変調器1の変調信号(モニタ用)
MikamiUitOpen 0:7a653530c8ce 8 //
MikamiUitOpen 1:32d6e3f7df30 9 // 2021/03/03, Copyright (c) 2021 MIKAMI, Naoki
MikamiUitOpen 0:7a653530c8ce 10 //---------------------------------------------------------------------
MikamiUitOpen 0:7a653530c8ce 11
MikamiUitOpen 0:7a653530c8ce 12 #include "SinOscIir.hpp" // sin 発生器
MikamiUitOpen 0:7a653530c8ce 13 #include "FM_Modulator.hpp" // FM 変調器
MikamiUitOpen 0:7a653530c8ce 14 #include "F446_ADC_Intr.hpp" // ADC, 割込み利用
MikamiUitOpen 0:7a653530c8ce 15 #include "F446_DAC_Dual.hpp" // DAC を2つのチャンネルで使う場合
MikamiUitOpen 0:7a653530c8ce 16 #include "IirDcCut.hpp" // 直流成分除去用フィルタ
MikamiUitOpen 0:7a653530c8ce 17 using namespace Mikami;
MikamiUitOpen 0:7a653530c8ce 18 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:7a653530c8ce 19
MikamiUitOpen 0:7a653530c8ce 20 const float AMP_ = 0.3f; // 搬送波の振幅
MikamiUitOpen 0:7a653530c8ce 21 const float FS_ = 500.0f; // 標本化周波数,単位: kHz
MikamiUitOpen 0:7a653530c8ce 22 const float T0_ = 1000/FS_; // 標本化間隔,単位:μs
MikamiUitOpen 0:7a653530c8ce 23
MikamiUitOpen 0:7a653530c8ce 24 AdcF446_Intr adc_(FS_, A1); // FM 変調器2の変調信号の入力端子:A1
MikamiUitOpen 0:7a653530c8ce 25 DacDual dac_; // 出力端子:A2, D13(固定)
MikamiUitOpen 0:7a653530c8ce 26
MikamiUitOpen 0:7a653530c8ce 27 SinOscIir modSignal_(440, T0_); // FM 変調器1の変調信号: 440 Hz の正弦波
MikamiUitOpen 0:7a653530c8ce 28 // SinOscIir は float 型の演算精度の関係であまり低い周波数の正弦波は
MikamiUitOpen 0:7a653530c8ce 29 // 発生できないため 100 Hz の正弦波を発生している
MikamiUitOpen 0:7a653530c8ce 30 SinOscIir amplitude_(100, T0_); // FM 変調器1の変調信号の振幅を変化させるため
MikamiUitOpen 0:7a653530c8ce 31
MikamiUitOpen 0:7a653530c8ce 32 FmModulator modulator1_( 70.0e3f, T0_); // FM 変調器1
MikamiUitOpen 0:7a653530c8ce 33 FmModulator modulator2_(130.0e3f, T0_); // FM 変調器2
MikamiUitOpen 0:7a653530c8ce 34
MikamiUitOpen 0:7a653530c8ce 35 // 入力の直流分除去用フィルタ
MikamiUitOpen 0:7a653530c8ce 36 // 高域通過フィルタ
MikamiUitOpen 0:7a653530c8ce 37 // バタワース特性
MikamiUitOpen 0:7a653530c8ce 38 // 次数    : 1 次
MikamiUitOpen 0:7a653530c8ce 39 // 標本化周波数:500.00 kHz
MikamiUitOpen 0:7a653530c8ce 40 // 遮断周波数 : 0.10 kHz
MikamiUitOpen 0:7a653530c8ce 41 IirDcCut dcCut_(9.987442E-01f, 9.993721E-01f); // 入力の直流成分除去用フィルタ
MikamiUitOpen 0:7a653530c8ce 42
MikamiUitOpen 0:7a653530c8ce 43 // AD 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:7a653530c8ce 44 void AdcIsr()
MikamiUitOpen 0:7a653530c8ce 45 {
MikamiUitOpen 0:7a653530c8ce 46 static int16_t count = 0;
MikamiUitOpen 0:7a653530c8ce 47 static float amp1 = 0;
MikamiUitOpen 0:7a653530c8ce 48
MikamiUitOpen 0:7a653530c8ce 49 float xn = adc_.Read(); // 外部の変調信号を入力
MikamiUitOpen 0:7a653530c8ce 50 // 100 回に 1 回正弦波を発生することにより,1 Hz の正弦波を発生している
MikamiUitOpen 1:32d6e3f7df30 51 if (++count >= 100)
MikamiUitOpen 0:7a653530c8ce 52 {
MikamiUitOpen 0:7a653530c8ce 53 amp1 = 0.01f*(amplitude_.Generate() + 1.0f);
MikamiUitOpen 0:7a653530c8ce 54 count = 0;
MikamiUitOpen 0:7a653530c8ce 55 }
MikamiUitOpen 0:7a653530c8ce 56 // 変調信号の準備
MikamiUitOpen 0:7a653530c8ce 57 float mod1 = amp1*modSignal_.Generate(); // 振幅が 1 Hz で変動する正弦波
MikamiUitOpen 0:7a653530c8ce 58 float mod2 = 0.2f*dcCut_.Execute(xn); // ADC に入力した信号から直流分除去
MikamiUitOpen 0:7a653530c8ce 59
MikamiUitOpen 0:7a653530c8ce 60 // FM 変調された信号を生成
MikamiUitOpen 0:7a653530c8ce 61 float yn = AMP_*(modulator1_.Execute(mod1) + modulator2_.Execute(mod2));
MikamiUitOpen 0:7a653530c8ce 62 dac_.Write(yn, mod1*30); // FM 変調された信号の出力
MikamiUitOpen 0:7a653530c8ce 63 }
MikamiUitOpen 0:7a653530c8ce 64
MikamiUitOpen 0:7a653530c8ce 65 int main()
MikamiUitOpen 0:7a653530c8ce 66 {
MikamiUitOpen 0:7a653530c8ce 67 printf("\r\nDAC (A2) に FM 変調された信号を出力します.\r\n");
MikamiUitOpen 0:7a653530c8ce 68 adc_.SetIntrVec(&AdcIsr);
MikamiUitOpen 0:7a653530c8ce 69 while (true) {}
MikamiUitOpen 0:7a653530c8ce 70 }