画像の周波数解析

初めに

 大学の社会人講座で画像の周波数操作があり、画像の周波数変換とはどういう事か気になったため、記述する。
 (時系列信号ならベクトルと考えて、フーリエ変換するのみで良いが、画像はどういうサンプル群でフーリエ変換するのか不明であったためだ)

画像の空間周波数フィルタリング

画像の空間周波数フィルタリングの手順は次の通り。[1]

① 画像を2次元FFTします。
② 周波数領域を入れ替えます。
④ 各種フィルタリングを行います。(例えばローパスフィルタならカット領域のスペクトルを0にします)
⑤ 周波数領域を入れ替えます。(元に戻す)
⑥ 2次元の逆FFTをします。
⑦ フィルタリングされた画像が完成します。

尚、周波数領域の1ピクセルは、明度が振幅、位置が周波数を表す。
[1] 【画像処理】フーリエ変換の原理・実装例

振幅スペクトルと位相スペクトルの違い

位相スペクトルの1ピクセルは、当該位置の輪郭を表現し、画像全体で見るとエッジ画像とみなせる。
振幅スペクトルの1ピクセルは、明度が振幅を表現し、画像全体で見ると元画像の形状情報を図示したものとみなせる。

https://www.ieice.org/tokyo/gakusei/activity/kenkyuu-happyoukai/happyou-ronbun/22/pdf/162.pdf

EDGE IMPULSでモーション特徴量をArduino向けにビルド

初めに

   Gesture Controlled Drone with M5Stack and Edge Impulse - Hackster.io を参考に、  M5StickCで取得したモーションデータ(加速度/ジャイロ/姿勢)を学習し、判定できるようにする

チュートリアルを試す

 上記URLに従いスマホでforward / right / leftにスマホを動かしデータ収集、分類、テストしてみた。  結果、認識率は100%と高精度。

int8でも精度は落ちないが、floatの方がspeed(認識速度?)が早いようだ。 どちらの型を使うかは、Flash容量、計算リソースに応じて決定したい。

Arduino Nano 33 BLE ソースコード

 buildされたコードを参考までに載せる。

/* Includes ---------------------------------------------------------------- */
#include <uecken-project-1_inferencing.h>
#include <Arduino_LSM9DS1.h>

/* Constant defines -------------------------------------------------------- */
#define CONVERT_G_TO_MS2    9.80665f
#define MAX_ACCEPTED_RANGE  2.0f        // starting 03/2022, models are generated setting range to +-2, but this example use Arudino library which set range to +-4g. If you are using an older model, ignore this value and use 4.0f instead

/*
 ** NOTE: If you run into TFLite arena allocation issue.
 **
 ** This may be due to may dynamic memory fragmentation.
 ** Try defining "-DEI_CLASSIFIER_ALLOCATION_STATIC" in boards.local.txt (create
 ** if it doesn't exist) and copy this file to
 ** `<ARDUINO_CORE_INSTALL_PATH>/arduino/hardware/<mbed_core>/<core_version>/`.
 **
 ** See
 ** (https://support.arduino.cc/hc/en-us/articles/360012076960-Where-are-the-installed-cores-located-)
 ** to find where Arduino installs cores on your machine.
 **
 ** If the problem persists then there's not enough memory for this model and application.
 */

/* Private variables ------------------------------------------------------- */
static bool debug_nn = false; // Set this to true to see e.g. features generated from the raw signal

/**
* @brief      Arduino setup function
*/
void setup()
{
    // put your setup code here, to run once:
    Serial.begin(115200);
    Serial.println("Edge Impulse Inferencing Demo");

    if (!IMU.begin()) {
        ei_printf("Failed to initialize IMU!\r\n");
    }
    else {
        ei_printf("IMU initialized\r\n");
    }

    if (EI_CLASSIFIER_RAW_SAMPLES_PER_FRAME != 3) {
        ei_printf("ERR: EI_CLASSIFIER_RAW_SAMPLES_PER_FRAME should be equal to 3 (the 3 sensor axes)\n");
        return;
    }
}

/**
 * @brief Return the sign of the number
 * 
 * @param number 
 * @return int 1 if positive (or 0) -1 if negative
 */
float ei_get_sign(float number) {
    return (number >= 0.0) ? 1.0 : -1.0;
}

/**
* @brief      Get data and run inferencing
*
* @param[in]  debug  Get debug info if true
*/
void loop()
{
    ei_printf("\nStarting inferencing in 2 seconds...\n");

    delay(2000);

    ei_printf("Sampling...\n");

    // Allocate a buffer here for the values we'll read from the IMU
    float buffer[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = { 0 };

    for (size_t ix = 0; ix < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; ix += 3) {
        // Determine the next tick (and then sleep later)
        uint64_t next_tick = micros() + (EI_CLASSIFIER_INTERVAL_MS * 1000);

        IMU.readAcceleration(buffer[ix], buffer[ix + 1], buffer[ix + 2]);

        for (int i = 0; i < 3; i++) {
            if (fabs(buffer[ix + i]) > MAX_ACCEPTED_RANGE) {
                buffer[ix + i] = ei_get_sign(buffer[ix + i]) * MAX_ACCEPTED_RANGE;
            }
        }

        buffer[ix + 0] *= CONVERT_G_TO_MS2;
        buffer[ix + 1] *= CONVERT_G_TO_MS2;
        buffer[ix + 2] *= CONVERT_G_TO_MS2;

        delayMicroseconds(next_tick - micros());
    }

    // Turn the raw buffer in a signal which we can the classify
    signal_t signal;
    int err = numpy::signal_from_buffer(buffer, EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal);
    if (err != 0) {
        ei_printf("Failed to create signal from buffer (%d)\n", err);
        return;
    }

    // Run the classifier
    ei_impulse_result_t result = { 0 };

    err = run_classifier(&signal, &result, debug_nn);
    if (err != EI_IMPULSE_OK) {
        ei_printf("ERR: Failed to run classifier (%d)\n", err);
        return;
    }

    // print the predictions
    ei_printf("Predictions ");
    ei_printf("(DSP: %d ms., Classification: %d ms., Anomaly: %d ms.)",
        result.timing.dsp, result.timing.classification, result.timing.anomaly);
    ei_printf(": \n");
    for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
        ei_printf("    %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
    }
#if EI_CLASSIFIER_HAS_ANOMALY == 1
    ei_printf("    anomaly score: %.3f\n", result.anomaly);
#endif
}

#if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_ACCELEROMETER
#error "Invalid model for current sensor"
#endif

Data Forwarder

 M5Cからcsvデータをweb Serialにより収集できるようだが、Installation - Edge Impulse Documentation してedge-impulse-data-forwarderを実行すると、nodejsのbinding絡みのエラーで上手く出来ない。  Referenceボードが来てから再度試す。  

文部科学省の履修証明プログラム(大学の社会人プログラム)

文部科学省の履修証明プログラム

https://shingakunet.com/syakaijin/article/risyushomei/index.html

履修証明プログラムの一番の特徴は、「専門性を高めキャリアアップしたい」「未経験から新たな業界に転職を果たしたい」「地域社会に貢献したい」といった社会人一人ひとりのニーズに応じてピンポイントで設計されたプログラムである

マナパス を見て、「大学・大学院」と「履修証明プログラムに」チェックを入れ、分野を入れると該当した講座が出てくる。

以下、個人的に気になったものをピックアップする。

信州大学 電気電子回路 3万円 締切 1/21で終了 https://shingakunet.com/syakaijin/article/risyushomei/641165.html

電通大 AIセキュリティ 56万(ちょっと高い https://shingakunet.com/syakaijin/article/risyushomei/1073988.html

京都工芸繊維 AI 9万円 開催中止...?_? 人集まらなかったのか??? https://shingakunet.com/syakaijin/article/risyushomei/1277931.html

広島大学 ものづくり 6万円 締切 2/28で終了 https://shingakunet.com/syakaijin/article/risyushomei/870970.html

大阪工業大学 AI 33万   締切3/12 https://shingakunet.com/syakaijin/article/risyushomei/1041663.html

九州大学 セキュリティ 17万

岡山大は下記。〆切4/28だが、5/8現在もまだぎりぎり申し込みできる。 おかやまIoT・AI・セキュリティ講座

事業概要

事業概要

2022年3月に開業しました。 ソフトウェア無線機に関するお仕事を受け付けます。

無線機:

マイコン

  • WiFi-Mesh / BLE-Mesh
  • 環境発電無線センサ

アプリ

  • センサプラットフォームアプリ製作

連絡先: yawaraka.radio@gmail.com

受信器の検討

はじめに

400MHz付近で使えるRFICを調査している. 10kHz幅電力を測定出来れば良いのだが1ppmの周波数精度(誤差4kHz以内程)で測りたい. 今は1ppm局発と急峻なアナログLPFを使う方式か,アナログは簡素にして10sps以上のADCとDigital Filterで10kHz切り出すか どちらかにする予定で検討している

RFIC

VHF/UHFダイレクトコンバージョンIC SL6609

SL6609は 470MHzまでのダイレクトコンバージョン FSK復調器として利用できるIC.

SL6609を使ってみた方が少しいるようで21MHz CW受信はできているようです. SL6609

400MHz付近で使ってみたく,またGtrator Filterの幅が気になる所.
400MHz局発を入手次第,pin1 / pin15の周波数特性を測ってみたい.

R820T

R820TのSpecを載せる.

特徴として下記がある.
・ESD(Electic static discharge)保護機能付きノッチフィルタ
・20MHz程度のオシレータで動作
・Fc4MHz 6~8MHz幅のLow-IF FIlterを備える

Low-IF FIlterのFcとBW

RTLSDR RTL2832U V3

RTLSDR V3は0.5M-24MHzまでDIRECT SAMPLING出来たり,Expansion PORTSがあるので拡張ができそうだ.

RFM22B

源振や設定変更すれば400MHzで使えそうな感じがするのでとりあえず購入して試してみる. https://www.sparkfun.com/datasheets/Wireless/General/RFM22B.pdf

アンチエリアシングフィルタ

 LPFも検討中.ArduinoやESP32のADCが数10kHz出せるなら良いが...

 8次スイッチトキャパシタフィルタ MAX294

ESP32 ADC Speed

ESP32 ADC Speed | LabFruits によると 27.1739spsは達成できている.

ソースコードを拝借し貼り付けておく.

28
#include <chrono>
#include <Arduino.h>
#include <driver/adc.h>
 
void setup() {
  Serial.begin(115200);
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
}
 
void loop() {
  const uint16_t samples = 10000;
 
  auto t1 = std::chrono::system_clock::now();
 
  for (uint32_t i=0; i<samples; i++) {
    adc1_get_raw(ADC1_CHANNEL_4); // GPIO32
  }
 
  auto t2 = std::chrono::system_clock::now();
 
  std::chrono::duration<double> diff = t2 - t1;
  auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(diff).count();
 
  Serial.printf("Samples: %u\n", samples);
  Serial.printf("Duration: %llums\n", ms);
  Serial.printf("KSPS: %0.4f", static_cast<double>(samples) / ms);
}

ポスト5G情報通信システム基盤強化研究開発事業

ポスト5G情報通信システム基盤強化研究開発事業

令和3年6月30日に公開された「https://www.meti.go.jp/press/2021/06/20210630001/20210630001-1.pdf:ポスト5G情報通信システム基盤強化研究開発事業 研究開発計画 」の目次を一部まとめる。 詳細はリンク先を参照。

既に採択されたものは下記スライドに記載されている。 https://www.meti.go.jp/press/2021/10/20211019004/20211019004-3.pdf

研究開発内容

コアネットワーク

  1. クラウド型コアの高度化技術の開発【システム技術開発】

  2. クラウド型ネットワーク統合管理・自動最適化技術の開発【システム技術開発】

伝送路

  1. 光伝送システムの高速化技術の開発【システム技術開発】

  2. 光伝送用DSPの高速化技術の開発

  3. 微細化の進展に対応した高速不揮発性メモリ技術の開発

  4. 固定無線伝送システム大容量化技術の開発【システム技術開発】

  5. バス型伝送高度化技術の開発【システム技術開発】

  6. 超高速光リンク技術の開発

  7. 光スイッチ高度化技術の開発

基地局

  1. 仮想化基地局制御部の高性能化技術の開発【システム技術開発】

  2. 基地局無線部の高性能化技術の開発【システム技術開発】

  3. 基地局装置間の相互接続性等の評価・検証技術の開発

  4. 高周波デバイスの高出力・小型化技術の開発

  5. 高温動作可能な光接続技術の開発

  6. 高周波帯アンプ一体型アレイアンテナ実装技術の開発

  7. RAN制御高度化技術の開発【システム技術開発】

MEC

  1. MEC向け大規模先端ロジックチップ設計技術の開発

  2. MECサーバー向け広帯域・大容量メモリモジュール設計技術の開発

端末

  1. 端末通信機能構成技術の開発

先端半導体製造技術の開発

  1. 先端半導体の前工程技術(More Moore 技術)の開発

  2. 先端半導体の後工程技術(More than Moore 技術)の開発

...略