不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
Diff: main.cpp
- 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