シングルチップマイクロコンピュータ用のいくつかのC言語アルゴリズム

シングルチップマイクロコンピュータ用のいくつかのC言語アルゴリズム

[[406759]]

マイクロコントローラの主な機能は、周辺機器を制御し、特定の通信とデータ処理を実現することです。マイクロコントローラはアルゴリズムの実装や複雑な計算の実行には向いていませんが、特定の状況では数学的演算が必然的に使用されます。

たとえば、マイクロコントローラがデータを収集しているとき、データにランダム エラーが発生します。ランダム エラーはランダムな干渉によって発生します。その特徴は、同じ量を同じ条件で測定すると、その大きさと符号が不規則に変化し、予測できないが、複数の測定結果は統計法則に従うことです。

ランダム干渉によって発生するエラーを克服するために、ハードウェアでフィルタリング技術を使用し、ソフトウェア アルゴリズムを使用してソフトウェアでデジタル フィルタリングを実装することができます。フィルタリング アルゴリズムは、多くの場合、システム測定および制御アルゴリズムの重要な部分であり、強力なリアルタイム パフォーマンスを備えています。

[[406760]]

デジタル フィルタリング アルゴリズムを使用してランダム干渉エラーを克服すると、次のような利点があります。

  1. デジタル フィルタリングは追加のハードウェア コストを必要とせず、計算プロセスが 1 つだけであり、信頼性が高く、インピーダンス整合の問題がありません。特に、デジタル フィルタリングは、アナログ フィルタでは不可能な非常に低い周波数の信号をフィルタリングできます。
  2. デジタル フィルタリングはソフトウェア アルゴリズムを使用して実装され、複数の入力チャネルが 1 つのフィルタリング プログラムを共有できるため、システム費用が削減されます。
  3. フィルタのフィルタリング手順や操作を適切に変更するだけで、フィルタ特性を簡単に変更でき、低周波干渉やランダム信号のフィルタリングがより効果的になります。
  4. シングルチップマイクロコンピュータシステムで一般的に使用されるフィルタリングアルゴリズムには、制限振幅フィルタリング、中央値フィルタリング、算術平均フィルタリング、加重平均フィルタリング、スライディング平均フィルタリングなどがあります。

[[406761]]

制限フィルタアルゴリズム

この操作では、隣接する 2 つのサンプルを減算して増分を取得し、増分の絶対値を 2 つのサンプル間で許容される最大差 A と比較します。

A のサイズは、測定対象物の特定の状況によって異なります。最大許容差以下の場合、現在のサンプリングは有効です。それ以外の場合は、最後のサンプリング値がこのデータのサンプルとして取得されます。

アルゴリズムのプログラムコードは次のとおりです。

  1. 1#define A // 許容される最大差 
  2. 2  
  3. 3char data; //最後のデータ 
  4. 4  
  5. 5文字フィルター()
  6. 6  
  7. 7{  
  8. 8  
  9. 9 char datanew; //新しいデータ変数 
  10. 10  
  11. 11 datanew = get_data (); //新しいデータ変数を取得する 
  12. 12  
  13. 13 if((データ新データ) > A||(データ新データ> A))  
  14. 14  
  15. 15 返されるデータ。  
  16. 16  
  17. 17 その他 
  18. 18  
  19. 19 datanew を返します。
  20. 20  
  21. 21}

例:

制限フィルタ方式は、主に温度や物体の位置など、ゆっくり変化するデータを処理する際に使用されます。使用時には適切なドアリミットAを選択することが重要です。これは通常、経験的データから、また必要に応じて実験から得ることができます。

[[406762]]

メジアンフィルタアルゴリズム

操作プロセスは、特定のパラメータをN回連続してサンプリングし(Nは通常奇数)、Nサンプルの値を小さいものから大きいものに並べ、中央の値を今回のサンプリング値とします。全体のプロセスは、実際にはシーケンスソートプロセスです。

アルゴリズムのプログラムコードは次のとおりです。

  1. 1#define N 11 //取得するデータの数を定義する 2 3char filter()  
  2. 4  
  3. 5{  
  4. 6 7 char value_buff[N]; //データを格納する配列を定義する 8 9 char count,i,j,temp;  
  5. 1011 (カウント= 0 ; カウント< N ; カウント++)  
  6. 1213 {  
  7. 1415 value_buf[count]=get_data();  
  8. 1617 delay(); //データ収集が遅い場合は、遅延または割り込みが必要になります 1819 }  
  9. 2021 ( j = 0 ; j < N ; j++)の場合 
  10. 2223 {
  11. 2425 値バッファ[i] >値バッファ[i+1])  
  12. 2627 {  
  13. 2829 temp = value_buff [i];  
  14. 3031 値バッファ[i]=値バッファ[i+1];  
  15. 3233 値バッファ[i+1]=temp;  
  16. 3435 }  
  17. 3637 }  
  18. 3839戻り値_buff[(N-1)/2];  
  19. 4041}

注: 偶発的な要因による変動や、サンプラーの不安定性による脈動干渉を除去するには、中央値フィルタリングの方が適しています。測定値がゆっくり変化する場合は、メディアンフィルタ法の方が効果的ですが、データが急速に変化する場合は、この方法は適していません。

[[406763]]

算術平均フィルタリングアルゴリズム

このアルゴリズムの基本原理は非常に単純で、N 個の連続したサンプリング値を取得し、算術平均を実行することです。

アルゴリズムのプログラムコードは次のとおりです。

  1. 1文字フィルター()  
  2. 2  
  3. 3{  
  4. 4  
  5. 5 整数合計= 0 ;  
  6. 6  
  7. 7 for(カウント= 0 ; カウント< N ; カウント++)  
  8. 8  
  9. 9 {  
  10. 10  
  11. 11 合計+=get_data();  
  12. 12  
  13. 13 遅延():  
  14. 14  
  15. 15 }  
  16. 16  
  17. 17 戻り値 (char)(合計/N);  
  18. 18
  19. 19}

説明: 算術平均フィルタリング アルゴリズムは、ランダム干渉のある信号をフィルタリングするのに適しています。この信号の特徴は、平均値を持ち、信号が特定の値を中心に変動することです。

信号の平均平滑化の度合いは、N の値によって完全に決まります。 N が大きい場合、滑らかさは高くなりますが、感度は低くなります。N が小さい場合、滑らかさは低くなりますが、感度は高くなります。平均値の計算を容易にするために、N は通常 4、8、16、32 などの 2 の整数乗であり、プログラム内で除算の代わりにシフト演算を使用できます。

[[406764]]

加重平均フィルタリングアルゴリズム

前述の「算術平均フィルタリングアルゴリズム」は、滑らかさと感度の間に矛盾があるからです。滑らかさと感度の関係を調整するために、加重平均フィルタリングを使用できます。

その原理は、N 個の連続するサンプリング値に異なる重み係数を掛けて累積することです。重み係数は通常、最初は小さく、その後大きくなります。これにより、後続のサンプリングの影響が強調され、システムがパラメータの変化傾向を理解しやすくなります。

各重み係数は 1 未満の小数であり、合計が 1 になるという終了条件が満たされます。加重演算後の累積合計が有効なサンプリング値となります。加重平均デジタルフィルタリングの数学的モデルは次のとおりです。

ここで、D は N 個のサンプリング値の加重平均、XN-i は Ni 番目のサンプリング値、N はサンプリング回数、Ci は加重係数です。重み係数 Ci は、平均値におけるさまざまなサンプリング値の割合を反映します。

一般的に、サンプリング時間が遅いほど、取得される割合が大きくなり、平均値における新しいサンプルの割合が増加する可能性があります。

加重平均フィルタリング方式では、信号の一部を強調表示し、信号の別の部分に抵抗することで、サンプリング値の変化の感度を向上させることができます。

サンプルプログラムコードは次のとおりです。

  1. 1char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //コード配列は重み付け係数テーブルであり、プログラム記憶領域に格納されます 
  2. 2  
  3. 3文字コードsum_jq = 1 +2+3+4+5+6+7+8+9+10+11+12;  
  4. 4  
  5. 5文字フィルター()  
  6. 6  
  7. 7{
  8. 8  
  9. 9 文字数;  
  10. 10  
  11. 11文字値バッファ[N];  
  12. 12  
  13. 13 整数合計= 0 ;  
  14. 14  
  15. 15 for(カウント= 0 ; カウント< N ; カウント++)  
  16. 16  
  17. 17 {  
  18. 18  
  19. 19 value_buff[count]=get_data();  
  20. 20  
  21. 21 遅延();  
  22. 22
  23. 23 }  
  24. 24  
  25. 25 (カウント= 0 ; カウント< N ; カウント++)  
  26. 26  
  27. 27 合計+=value_buff[カウント]*jq[カウント];  
  28. 28  
  29. 29 戻り値 (char)(sum/sum_jq);  
  30. 30  
  31. 31}

[[406765]]

スライディング平均フィルタアルゴリズム

上記の紹介とさまざまな平均フィルタリング アルゴリズムには共通点が 1 つあります。つまり、各有効なサンプリング値を連続して複数回サンプリングする必要があるということです。サンプリング速度が遅い場合、リアルタイム システムを保証できません。

ここで紹介するスライディング平均フィルタリング アルゴリズムは、一度だけサンプリングし、そのサンプリング値を過去の複数のサンプリング値と平均化し、得られた有効なサンプリング値を使用できます。

平均を計算するために N 個のサンプル値を取得する場合、ストレージ領域に N 個のデータ一時ストレージ領域を開く必要があります。

収集された新しいデータはそれぞれ一時記憶領域に保存され、同時に最も古いデータが削除されるため、保存される N 個のデータは常に最新の更新データになります。このデータ保存方法は、リングキュー構造を使用することで簡単に実装できます。

プログラムコードは次のとおりです。

  1. 1文字値バッファ[N];  
  2. 2
  3. 3文字i = 0 ;  
  4. 4  
  5. 5文字フィルター()  
  6. 6  
  7. 7{  
  8. 8  
  9. 9 文字数;  
  10. 10  
  11. 11 整数合計= 0 ;  
  12. 12  
  13. 13 value_buff[i++]=get_data();  
  14. 14  
  15. 15 もし( i == N)  
  16. 16  
  17. 17 i = 0 ;  
  18. 18  
  19. 19 (カウント= 0 ; カウント< N ; カウント++)  
  20. 20
  21. 21合計= value_buff [カウント];  
  22. 22  
  23. 23 戻り値 (char)(合計/N);  
  24. 24  
  25. 25}

[[406766]]

ローパスフィルタリング

通常のハードウェア RC ローパス フィルタの微分方程式は差分方程式として表現され、ソフトウェア アルゴリズムを使用してハードウェア フィルタの機能をシミュレートできます。導出後、ローパス フィルタ アルゴリズムは次のようになります。

  1. 1Yn = a * Xn + (1-a) * Yn-1  
  2. 2  
  3. 3式中のXnは今回のサンプリング値である 
  4. 4  
  5. 5Yn-1——最後のフィルタ出力値。  
  6. 6  
  7. 7a——フィルタ係数。その値は通常1よりはるかに小さい。  
  8. 8  
  9. 9Yn——このフィルタリングの出力値。

上記の式から、このフィルタリングの出力値は主に前のフィルタリングの出力値に依存することがわかります(前のサンプリング値ではないことに注意してください。これは加重平均フィルタリングとは本質的に異なります)。このサンプリング値のフィルタリング出力への寄与は比較的小さいですが、ある程度の補正効果があります。このアルゴリズムは、大きな慣性を持つ特定のローパスフィルタの機能をシミュレートします。フィルタリング アルゴリズムのカットオフ周波数は、次の式を使用して計算できます。

  1. 1fL = a /2Pit πは3.14です…  
  2. 2  
  3. 3式中、aはフィルタ係数である。  
  4. 4  
  5. 5t——サンプリング間隔;  
  6. 6  
  7. 7たとえば、 t = 0.5s (つまり1秒あたり2回)の場合、 a = 1/32です。  
  8. 8  
  9. 9fL =(1/32)/(2*3.14*0.5)=0.01Hz

これは、ターゲットパラメータが非常にゆっくり変化する物理量である場合に効果的です。一方、サンプリング周波数の 1/2 を超えるドライ信号をフィルタリングすることはできません。この例では、サンプリング周波数は 2Hz なので、1Hz を超えるドライ信号をフィルタリングするには他の方法を使用する必要があります。

ローパス フィルタ アルゴリズムは加重平均フィルタに似ていますが、加重係数は a と 1-a の 2 つだけです。計算の便宜上、a は整数として扱われ、1-a は 256-a に置き換えられ、計算結果の最下位バイトは破棄されます。項目は a と 1-a の 2 つしかないため、両方とも即値の形式でプログラムにプログラムされ、別のテーブルは必要ありません。

サンプリング値は単位バイト(8ビットA/D)です。計算の精度を確保するために、フィルターの出力値は整数用に 1 バイト、小数用に 1 バイトの 2 バイトで表されます。そうしないと、仮数が毎回破棄されるため、出力が変化しない可能性があります。

Yn-1 が 30H (整数) と 31H (10 進数) の 2 つの単位に格納され、Yn が 32H (整数) と 33H (10 進数) の 2 つの単位に格納されているとします。

<<:  機械読解:人工知能技術の重要な分野の一つ

>>:  ついに誰かが畳み込みニューラルネットワーク(CNN)を明確にした。

ブログ    

推薦する

Boyaのディープラーニング製品がHuman Horizo​​nsの自動運転実現に貢献

ヒューマンホライゾンズテクノロジーズ株式会社は、新エネルギー車、インテリジェントネットワーク、共同交...

Hive でサポートされているファイル形式と圧縮アルゴリズム

[[194194]]概要正しいファイル タイプと圧縮タイプ (Textfile+Gzip、Seque...

人工知能はソフトウェア開発のパラダイムを変えている

今日、多くのソフトウェア開発者は、コードの作成とレビュー、バグの検出、ソフトウェアのテスト、開発プロ...

古典的な構造から改良された方法まで、ニューラルネットワーク言語モデルのレビュー

自然言語処理 (NLP) システムのコアコンポーネントとして、言語モデルは単語表現と単語シーケンスの...

...

次世代ロボットは「人間と共存」するかもしれない。中国はこのチャンスをどうつかむのか?

「次世代のロボットは『人間と共存する』ものになるだろう。中国がこのチャンスをつかめば、ロボットイノ...

「業界最強」と称されるアリトン・イー・チエンウェン、国内No.1大型モデルを目指す

どの時代にもメインテーマがあり、次の10年の主なテーマはAIです。 ChatGPTの登場以来、中国で...

人工知能専攻にはどのような専攻が含まれますか?見通しはどうですか?

人工知能にはどのような専攻が含まれますか?人工知能に関連する研究方向には、パターン認識とインテリジェ...

...

推奨システムにおける自然言語処理 (NLP) の応用

[[195357]]パーソナライズされた推奨はビッグデータ時代に欠かせない技術であり、電子商取引、情...

Googleは人工知能を使って人間の認知の欠陥を浮き彫りにする

今日では、驚くほど人間らしい文章の一部は、実際には大量の人間の文章でトレーニングされた AI システ...

...

新しいターミナルゲームプレイ: 「ゼロコード」スクリプトベースのガイダンス

著者 | 宋涛、尚賢、小斌 他アプリガイダンスは端末上でのマインドセット構築の重要な手段です。私たち...

調査と市場:2025年までに世界のヘルスケア人工知能市場は272億ドルに達する

市場調査会社リサーチ・アンド・マーケッツが最近発表したレポートによると、人工知能の世界のヘルスケア市...