不韋 呂
/
SDR_FM_Tx
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年5月号に掲載
main.cpp@1:32d6e3f7df30, 2021-03-03 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Mar 03 01:20:09 2021 +0000
- Revision:
- 1:32d6e3f7df30
- Parent:
- 0:7a653530c8ce
2
Who changed what in which revision?
User | Revision | Line number | New 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 | } |