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

Dependencies:   mbed

Revision:
2:4bec6b2be809
Parent:
1:30d9fb51dec1
Child:
3:878a48f15e89
--- a/main.cpp	Mon Sep 23 07:32:10 2019 +0000
+++ b/main.cpp	Sat Aug 29 11:19:03 2020 +0000
@@ -6,12 +6,12 @@
 //      入力ピン: A1
 //      出力ピン: A2
 //
-//  2019/09/18, Copyright (c) 2019 MIKAMI, Naoki
+//  2020/08/17, Copyright (c) 2020 MIKAMI, Naoki
 //-------------------------------------------------------------
 
 #include "F446_ADC_Intr.hpp"    // ADC
 #include "F446_DAC.hpp"         // DAC
-#include "QuadOscIir.hpp"       // 二相発振器
+#include "QuadOscIir.hpp"       // 直交信号発生器
 #include "Cic3Stage.hpp"        // 3段 CIC フィルタ
 #include "Iir1st.hpp"           // 一次の IIR フィルタ
 #include "InitialMessage.hpp"   // 最初のメーッセージ
@@ -20,9 +20,9 @@
 
 const float FS_ = 900.0f;       // 標本化周波数,単位: kHz
 const float T0_ = 1000/FS_;     // 標本化間隔,単位:μs
-const float A0_ = 8192;         // 二相発振器の出力の振幅
+const float A0_ = 8192;         // 直交信号発生器の出力の振幅
 
-// 各放送局の搬送波の周波数,単位: kHz
+// 各放送局の搬送波の周波数,単位: Hz
 const float F_C_[] = {  594.0e3f,   // NHK 第1
                         693.0e3f,   // NHK 第2
                         810.0e3f,   // AFN Tokyo
@@ -53,9 +53,9 @@
     float sinX, cosX;
     nco_.Generate(sinX, cosX);  // sin, cos 発生
 
-    // cos/sin を乗算したデータに対する CIC フィルタの累算処理
-    cic3I_.Accumulate((int16_t)(xn*cosX));  // I 信号用
-    cic3Q_.Accumulate((int16_t)(xn*sinX));  // Q 信号用
+    // cos/sin を乗算したデータに対する CIC フィルタの積分処理
+    cic3I_.Integrate((int16_t)(xn*cosX));   // I 信号用
+    cic3Q_.Integrate((int16_t)(xn*sinX));   // Q 信号用
 
     if (++count >= DS_RATE_)
     {
@@ -67,22 +67,22 @@
 // ダウンサンプラより後の処理に対する割り込みサービス・ルーチン
 void SwiIsr()
 {
-    // CIC フィルタの差分処理
-    float yI_n = cic3I_.Difference();   // 差分処理で I 信号を生成
-    float yQ_n = cic3Q_.Difference();   // 差分処理で Q 信号を生成
+    // CIC フィルタのくし形フィルタの部分による処理
+    float yI_n = cic3I_.CombFilter();   // くし形フィルタ処理で I 信号を生成
+    float yQ_n = cic3Q_.CombFilter();   // くし形フィルタ処理で Q 信号を生成
 
     float yn = sqrtf(yI_n*yI_n + yQ_n*yQ_n);    // 包絡線成分を求める
     yn = comp_.Execute(yn);             // 補償フィルタ
     float dc = averaging_.Execute(yn);  // 直流分を求める
+    yn = yn - dc;   // 直流分除去
 
     float gain = 0.8f/dc;               // AGC 処理の準備
     if (gain > 200.0f) gain = 200.0f;
 
-    // DAC への出力は,直流分を除去し,AGC 処理をしたもの
-    dac_.Write(gain*(yn - dc));
+    dac_.Write(gain*yn);
 }
 
-// シリアル・ポートの受信割込みに対する処理
+// シリアル・ポートの受信割込みに対する割り込みサービス・ルーチン
 void RxIsr()
 {
     unsigned char chr = pc_.getc();
@@ -97,11 +97,11 @@
 
 int main()
 {
-    InitialMessage("ダウンサンプリングに CIC フィルタ使用.", AM, pc_);
+    InitialMessage("ダウンサンプリングに CIC フィルタを使用.", AM, pc_);
 
     NVIC_SetPriority(ADC_IRQn,    0);   // 最優先
     NVIC_SetPriority(EXTI4_IRQn,  1);   // 2番目に優先
-    NVIC_SetPriority(USART2_IRQn, 2);
+    NVIC_SetPriority(USART2_IRQn, 2);   // 3番目に優先
 
     // ADC に対する割り込みサービス・ルーチンの設定
     adc_.SetIntrVec(&AdcIsr);
@@ -115,4 +115,4 @@
     pc_.attach(&RxIsr);
 
     while (true) {}
-}
+}
\ No newline at end of file