SSブログ

スーパープレッシャー気球が次の宇宙時代を切り拓く? [トンデモ学説]

”ロックーン”や”金星のコロニー”で気球について興味を持ったので調べていたところ「スーパープレッシャー気球」なる技術が未来社会の鍵になることが分かってきました。各国技術開発を活発に行っているようです。もちろん日本もです。


長時間飛翔用スーパープレッシャー気球の開発と実証
SPB2.jpg
http://www.isas.jaxa.jp/home/kougaku/03_report/2019_senryaku/24_saito_senryaku_report_2019.pdf


と、思ったけど研究費が数百万って、しょぼ・・・。しょぼすぎる。(´・ω・`)

なぜ、今「スーパープレッシャー気球」なのか?通常の気球は太陽に熱せられると内部の気体が膨張し気球を圧迫します。そのダメージを避けるため、内部の気体を逃し気圧を下げます。一方で夜になると冷えるので、バラストを投下して高度を維持します。

これを「ゼロプレッシャー気球」と呼びますが、どんどん内部のリソースを削っていくので、あっという間に気球が使えなくなります。それを克服するのが「スーパープレッシャー気球」です。

「スーパープレッシャー気球」は軽量で高強度の繊維で作られた気球で、気体の膨張にも耐えられるため、内部の気体を放出する必要ありません。繊維開発はグンゼやフジクラが担当しているようですね。


スーパープレッシャー気球の性能試験を実施
SPB3.jpg
http://www.isas.jaxa.jp/j/snews/2006/0209.shtml


2016年にはNASAが「スーパープレッシャー気球」で46日ものロングフライトを実現。機材回収優先のため、この日数になったようで、気球そのものは100日を超えることも可能な状態だったようです。


【高論卓説】NASA「スーパープレッシャー気球」
nasa_spb.jpg
https://www.sankeibiz.jp/business/news/170510/bsc1705100500011-n2.htm


高度50kmの成層圏で落ちない気球が実現できると世界は大きく変わります。携帯の基地局も減らせますし、衛星よりも細かく行えるセンシングが農業や交通、設備管理を大きく変えるでしょうし、また天気予報もより細かいレベルで行うことができます。

そして「スーパープレッシャー気球」の技術は、そのまま「ロックーン」にも使えますので小型衛星の打ち上げのコストダウンにも寄与できます。さらにはISSへの中継地点になるかも知れません。

ということを考えていたら、すでにアメリカではビジネスにしている会社があるのですね。(さすがにスーパープレッシャー気球ではないようですが)


worldview.png
https://worldview.space/


さすがアメリカだなぁ。しかも繁盛していそう。このようなサービスで着実にビジネスを伸ばしながら宇宙開発への足掛かりも作っていく。そんな実践型の日本の先端企業が出てこないかな。
(´・ω・`)





気球工学―成層圏および惑星大気に浮かぶ科学気球の技術 (宇宙工学シリーズ)

気球工学―成層圏および惑星大気に浮かぶ科学気球の技術 (宇宙工学シリーズ)

  • 出版社/メーカー: コロナ社
  • 発売日: 2004/02/01
  • メディア: 単行本



日本の軍用気球 知られざる異色の航空技術史 (光人社NF文庫)

日本の軍用気球 知られざる異色の航空技術史 (光人社NF文庫)

  • 作者: 佐山 二郎
  • 出版社/メーカー: 潮書房光人新社
  • 発売日: 2020/03/25
  • メディア: 文庫



An operational super-pressure balloon system to carry 50 pounds to 10 millibar atmospheric pressure Final report (English Edition)

An operational super-pressure balloon system to carry 50 pounds to 10 millibar atmospheric pressure Final report (English Edition)

  • 作者: NASA, National Aeronautics and Space Administration
  • 出版社/メーカー:
  • 発売日: 2019/09/04
  • メディア: Kindle版





nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

【朗報】息子の前期の成績は? [4コマ漫画]

大学生の息子の前期の成績が出てきたので見せに来ました。今どきは半期をセメスターっていうらしいですね。最初”ワンセメの結果見る?”と言われたので何のことかと思いました。

ずっとコロナでオンライン授業・オンラインテストだったのでどうなることかと思いましたが、どうやら落単はなかったようです。それどころか、その結果は?


成績.png


いやーほとんど”AA”か”A”。すごいなぁ。さすが一時期は最高学府を目指そうかと言っていただけはある。息子にはたしなめられましたが、スクショは息子に記念にもらったので、一部をここで公開しちゃいます。(親馬鹿でスイマセン…(∀`*ゞ))


screen_shot.jpg


この成績がずっと続けば、夢の宇宙工学の研究者に一歩近づくぞ。がんばれー!
(^^)/~





学びを結果に変えるアウトプット大全 (Sanctuary books)

学びを結果に変えるアウトプット大全 (Sanctuary books)

  • 作者: 樺沢紫苑
  • 出版社/メーカー: サンクチュアリ出版
  • 発売日: 2018/08/03
  • メディア: 単行本(ソフトカバー)



はじめての宇宙工学

はじめての宇宙工学

  • 作者: 鈴木 弘一
  • 出版社/メーカー: 森北出版
  • 発売日: 2007/04/01
  • メディア: 単行本



図説 宇宙工学

図説 宇宙工学

  • 出版社/メーカー: 日経印刷
  • 発売日: 2020/08/28
  • メディア: 単行本




タグ:日常
nice!(26)  コメント(0) 
共通テーマ:趣味・カルチャー

【アフターコロナ】資本主義の次に来るものとは?「いいね!」主義の到来か? [トンデモ学説]

気分転換にネットサーフィン(古い?)をしていたら、次のような記事が目に付きました。


endofcapitalizm.jpg
人類は資本主義を本当にこのまま続けられるか
https://toyokeizai.net/articles/-/313357?page=5


興味深いの読んでみました。雑に要約してみると、”今のまま消費中心の資本主義が行き過ぎるといつか破綻(ハードランディング)するだろう。そうならないためにはベーシックインカムの導入やモノやサービスを共有財産化していってはどうだろう?”という内容です。

”いつか破綻するだろう”というのは同意ですが、それを回避するのに社会主義を導入というところはどうなんですかねぇ?冷戦の時代に失敗しているのを”おかわり”するのもどうかと。


で、ここからはとんでも持論です。
私は資本主義の次には「いいね!」主義が到来すると予言します!
( ー`дー´)キリッ

冗談のようですが、結構まじめです。では、「いいね!」主義を解説しましょう。


人間の歴史を振り返って見ると、「投資」というのは、人間が社会生活を始めた古くから行われていた行為で、そうそう無くなるものではありません。


物々交換時代:
自分の欲しいモノと交換(リターン)するために、他の人たちが欲しがる何かを自分で探し出したり作り出す(投資)

exchange.png


金銀取引時代:
自分の欲しいモノと交換できる金銀(リターン)を得るために、他の人たちが欲しがる何かを探し出したり作り出す(投資)

gold.jpg


貨幣取引時代:
自分の欲しいモノと交換できる貨幣(リターン)を得るために、他の人達が欲しがる何かを探し出したり作り出す(投資)

doller.jpg


ここで、「金銀取引」から「貨幣取引」の移行で大きなジャンプがあります。紙切れというなんの価値のないものに価値を与えたというパラダイム・シフトが発生しました。金本位制がなくなったのは、ほんの数十年前の出来事なので、最近の話です。


で、アフターコロナはキャッシュレス化が進み「貨幣」さえもなくなる時代が来ます。


信用取引時代:
自分の欲しいものと交換できる信用貨幣(リターン)を得るために、他の人達が欲しがる何かを探し出したり作り出す(投資)

reji_kaiinsyou_smartphone.jpg


こうして見ると、いつの時代の人も(リターン)を得るために何かしら(投資)をするという行為を繰り返してきました。つまり、「所有」という概念は人の性なので社会主義は相容れることは出来ません。


では、その先はどうなるでしょう?このまま消費社会が続くのかというと、そうはならないというのが持論です。それを変えるのが「いいね!」です。


いいね!取引の未来:
自分の欲しいものと交換できる「いいね!」(リターン)を得るために、多くの人達に称賛される何かを探し出したり作り出したり行動する(投資)

iine.jpg


「信用取引」から「いいね!」時代に転換するには、大きなパラダイム・シフトが必要です。しかし、それはすでに現在進行形で進んでいます。

最近は、科学技術が進んだため「自分の欲しいモノ」というのが少なくなってきています。世の中が便利になり生活に満足してきたわけですね。

一方で、多くの人は、SNSで代表されるように「いいね!」を欲しがるようになってきました。SNSで「いいね!」や、ゲームのポイントを集めるのに夢中になる人が増えてきています。「いいね!が欲しい」が「モノが欲しい!」に取って代わるようになってきたわけです。

さらに踏み込んで、「いいね!」で間接的に集めたポイント(アフィリエイト)は、モノや情報と交換できるようにもなってきています。

それがどんどん進んでくると、人々はより多くの「いいね!」を集めるためにボランティアや環境保護など、皆に称賛される社会貢献を率先して行うことになると思います。

そして、数多くのサービスが提供する「いいね!」を表すデジタルデータが経済の実体を牽引していくと「貨幣」という概念そのものが希薄になってきて、「貨幣」そのものが「いいね!」を表す多くの指標の一つになっていくことになると思います。

さらにもう一歩踏み込んで考えていくと、「いいね!」取引の境界が人と人を隔てる新たなボーダとなっていくかも知れません。まさにデジタルワールドの到来ですね、

新たな「いいね!」時代でも摩擦や争いが絶えることはないでしょう、でも人の行動原理が「貨幣を得たい」から「いいね!を得たい」という風に変わっていったら、きっと世界はもっと楽しく過ごしやすくなるんじゃないかなと思います。

アフターコロナも人類に幸あれ!(^^)/~





ポストコロナの資本主義 挑戦される国家・企業・通貨 (日本経済新聞出版)

ポストコロナの資本主義 挑戦される国家・企業・通貨 (日本経済新聞出版)

  • 作者: 岩村充
  • 出版社/メーカー: 日経BP
  • 発売日: 2020/08/21
  • メディア: Kindle版



ポストコロナの「日本改造計画」 デジタル資本主義で強者となるビジョン

ポストコロナの「日本改造計画」 デジタル資本主義で強者となるビジョン

  • 作者: 竹中 平蔵
  • 出版社/メーカー: PHP研究所
  • 発売日: 2020/07/30
  • メディア: 単行本(ソフトカバー)



2025年のデジタル資本主義: 「データの時代」から「プライバシーの時代」へ (NHK出版新書 623)

2025年のデジタル資本主義: 「データの時代」から「プライバシーの時代」へ (NHK出版新書 623)

  • 作者: 田中 道昭
  • 出版社/メーカー: NHK出版
  • 発売日: 2020/05/11
  • メディア: 新書




nice!(21)  コメント(0) 
共通テーマ:趣味・カルチャー

【コロナ状況分析定期】冬のオーストラリアの状況と比較する [徒然日記]

コロナですが、前回の予測通り重傷者・死亡者が増加する結果となってしまいました。残念ですね。政府が火消しをしている横で火を付けるようなことをするので仕方ないかも知れませんが。非常事態宣言の解除をあと二週間我慢できれば、もう少し様子が変わったと思うのですが。

さて、最初に日本の最新の状況を確認しましょう。いつもの東洋経済さんのサイトからの引用です。


まず陽性者数ですがピークは超えているようです。ただ、お盆のGoToの影響がでてくるのはこれからなのであまり楽観はできないかと。

0_positive_number.png


PCR検査人数もあまり増やす計画はないようですね。むやみに拡げても保健所や医療機関に負担をかけるので少し抑え気味にしているようです。

1_pcr_test.png


実効再生産数はかなり抑えられてきました。GoToがあるので拡がるかなと思ったのですが、皆さんかなり用心しているようですね。

2_reproduce_number.png


入院患者はかなり減ってきているようです。ピークを超えたという判断の根拠はこの数字のようですね。

3_need_hopital.png


重傷者数もサチってきています。

4_seriously_injured.png


死亡者数は残念ながら増加傾向です。これから下がる方向になるとは思いますが…。

5_death_number.png


年齢別の陽性者数は20代から80代まで正規分布のような拡がりになってきました。

6_age_distr.png


さて、前回、冬に向かって感染ならびに死亡者数が増えてくるのではないか?という考察をしました。オーストラリアは今ちょうど冬です。しかも、医療水準が同じくらいですので良いベンチマークとなると思いデータを参照してみました。


まずオーストラリアの陽性者数ですが、日本と非常に似たような傾向となっています。数はだいたい東京都と同じくらいでしょうか。日本と同じく第二波はピークアウトしているようです。

7_positive_num_aus.png
https://www.worldometers.info/coronavirus/country/australia/


死亡者数も、同じくピークアウトしていますが、第一波に比べると死亡率は高くなっているようです。やはり冬の気候が影響しているのかも知れません。

8_death_num_aus.png
https://www.worldometers.info/coronavirus/country/australia/


陽性者数の年齢別の分布ですが、20代をピークに日本と同じ様な分布となっています。

9_age_distr_aus.png
https://www.health.gov.au/news/health-alerts/novel-coronavirus-2019-ncov-health-alert/coronavirus-covid-19-current-situation-and-case-numbers


死亡者数の年齢別の分布です。やはり70代以上が顕著ですね。

A_death_age_distr_aus.png
https://www.health.gov.au/news/health-alerts/novel-coronavirus-2019-ncov-health-alert/coronavirus-covid-19-current-situation-and-case-numbers


オーストラリアの統計で気になるのは第二波の死亡率です。ざっと第一波の2倍以上でしょうか?第二波をやりすごしても、本当の正念場は今年の冬かも知れません。今後もオーストラリアの推移を見守っていきたいと思います。
( ー`дー´)





ゴーマニズム宣言 新型コロナパニック論 ゴーマニズム宣言 2nd Season (SPA!コミックス)

ゴーマニズム宣言 新型コロナパニック論 ゴーマニズム宣言 2nd Season (SPA!コミックス)

  • 作者: 小林 よしのり
  • 出版社/メーカー: 扶桑社
  • 発売日: 2020/08/20
  • メディア: Kindle版



コロナ後の世界 (文春新書)

コロナ後の世界 (文春新書)

  • 出版社/メーカー: 文藝春秋
  • 発売日: 2020/07/20
  • メディア: Kindle版



コロナ、戦争、危機管理 指導者たちの「失敗の本質」 (中央公論ダイジェスト)

コロナ、戦争、危機管理 指導者たちの「失敗の本質」 (中央公論ダイジェスト)

  • 出版社/メーカー: 中央公論新社
  • 発売日: 2020/08/25
  • メディア: Kindle版




タグ:コロナ
nice!(23)  コメント(0) 
共通テーマ:趣味・カルチャー

【朗報】SPRESENSE の CircuitPython が "GPS"をサポート! [SPRESENSE]

前回、SPRESENSEでCircuitPythonを試してみたのはだいたい3ヶ月くらい前。


python-spresense.png
■ SPRESENSE で "CircuitPython" を動かしてみた!
https://makers-with-myson.blog.ss-blog.jp/2020-05-08
■ SPRESENSE用”CircuitPython”のビルド環境を作ろう!(目次編
https://makers-with-myson.blog.ss-blog.jp/2020-05-10


前回はまだ完成度が低く発展途上だったのでアップデートはあるだろうなと思い、時々 CircuitPythonの GitHub の IssueList をチェックしているのですが、先日こんな "Issue" を発見!


IssueList.png


早速、最新のツリーをCloneしてビルドしてみました。ビルドの仕方はこちらを参照してください。


2020-05-09.png


GNSSとSDカードの確認をするためにサンプルコードを組んで試してみました。(サンプルコードは shared-bindings のソースコードの中にコメントとして記述されています)


■ GNSSのサンプルコード
import gnss
import time

print("start")

nav = gnss.GNSS([gnss.SatelliteSystem.GPS, gnss.SatelliteSystem.GLONASS])
last_print = time.monotonic()

while True:
    nav.update()
    current = time.monotonic()
    if current - last_print >= 1.0:
        last_print = current
        if nav.fix is gnss.PositionFix.INVALID:
            print("Waiting for fix...")
            continue
        print("Latitude: {0:.6f} degrees".format(nav.latitude))
        print("Longitude: {0:.6f} degrees".format(nav.longitude))




こちらのコンソール出力がこれ。おぉ、部屋の中からですが位置を補足してます。なかなか偉いですねSPRESENSE。位置情報が得られるようになると色々とアプリケーションを作る気が湧いてきます。


logout.png


USBケーブルは拡張ボード側のUSBポートに接続してください。Arduino IDE と異なり、シリアル出力も拡張ボードのUSBポートから出力されます。間違ってメインボードに挿して、シリアルが出ないと慌てないようにしてください。


次はSDカードの確認です。CircuitPython 標準の "sdcardio" と実装が別になってるのはなんでじゃろ?と思ったら "sdcardio" のほうはSPIなんですね。SPRESENSEのSDカードは高速のSDIOインターフェースなので別の実装が必要だったみたいです。


■ SDIOのサンプルコード
import sdioio
import storage
import os


print("start")

sd = sdioio.SDCard(clock=board.SDIO_CLOCK, command=board.SDIO_COMMAND, data=board.SDIO_DATA, frequency=2500000)

vfs = storage.VfsFat(sd)
storage.mount(vfs, '/sd')
fp = open("/sd/tmp.txt", "a")
fp.write("hello world!")
fp.close()



code.py を保存するとすぐに動き出し、SDカード上に”Hello World!”が書き込まれた "tmp.txt" が出来上がりました。やった!

これで位置情報をSDカードに記録するトラッカーが出来上がりますね。拡張ボードは大きいので、スイッチサイエンスで売っている小さな拡張ボードだと小さなGPS トラッカーが出来上がりそうです。


Kaspi.jpg
https://www.switch-science.com/catalog/5374/


これからのアップデートをさらに期待したいところですね!
( ^ω^ )/~





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



Getting Started with Adafruit Circuit Playground Express: The Multipurpose Learning and Development Board with Built-In LEDs, Sensors, and Accelerometer

Getting Started with Adafruit Circuit Playground Express: The Multipurpose Learning and Development Board with Built-In LEDs, Sensors, and Accelerometer

  • 作者: Barela, Anne
  • 出版社/メーカー: Make Community, LLC
  • 発売日: 2018/09/18
  • メディア: ペーパーバック




nice!(24)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSEスペクトログラムをアップデート!! [SPRESENSE]

SPRESENSEスペクトログラムをアップデートしました。今回は微妙な変化がわかるようにグレースケールで表示してみました。あとピーク周波数を出すようにしています。


sDSC_0008.jpg


実際の動きはこちらをご覧ください。





スケッチはこちら。解析はメインコアで、表示はサブスコアで行っています。MP.Mutex でサブスコアにデータを送るタイミングをとっています。


■ メインコアのスケッチ
#ifdef SUBCORE
#error "Core selection is wrong!!"
#endif

#include 
#include 
#include 
#define SUBCORE1 1

MPMutex mutex(MP_MUTEX_ID0);
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

#include 
#include 
#include 
#define FFT_LEN  256
#define CHANNEL_NUM 1

// #define LPF_ENABLE
#define LPF_CUTOFF 3000
#define LPF_QVALUE 0.70710678

// #define SMA_ENABLE
#define SMA_WINDOW 8

FFTClass FFT;
IIRClass LPF;

AudioClass *theAudio = AudioClass::getInstance();
static const int32_t buffer_sample = FFT_LEN;
static const int32_t buffer_size = buffer_sample * sizeof(int16_t);
static const uint32_t sampling_rate = AS_SAMPLINGRATE_48000;
static char buff[buffer_size];

static float pDst[FFT_LEN];
static float pOut[FFT_LEN];

#ifdef SMA_ENABLE
static float pSMA[SMA_WINDOW][FFT_LEN];

void applySMA(float sma[SMA_WINDOW][FFT_LEN], float dst[FFT_LEN]) 
{
  int i, j;
  static int g_counter = 0;
  if (g_counter == SMA_WINDOW) g_counter = 0;
  for (i = 0; i < FFT_LEN; ++i) {
    sma[g_counter][i] = dst[i];
    float sum = 0;
    for (j = 0; j < SMA_WINDOW; ++j) {
      sum += sma[j][i];
    }
    dst[i] = sum / SMA_WINDOW;
  }
  ++g_counter;
}
#endif

static void audioReadFrames() {
  int err, ret;
  uint32_t read_size;
  static bool bInit = true;
  static q15_t pLPFSig[buffer_size];
  static const unsigned long wait_usec =  (double)(buffer_sample)/sampling_rate*1000000;
  Serial.println(wait_usec);
  
  while(1) {
    err = theAudio->readFrames(buff, buffer_size, &read_size);
    if (err != AUDIOLIB_ECODE_OK && err != AUDIOLIB_ECODE_INSUFFICIENT_BUFFER_AREA) {
      Serial.println("Error err = " + String(err));
      theAudio->stopRecorder();
      exit(1);
    }

    if (read_size < buffer_size) {
      usleep(wait_usec);
      continue;
    }
    
#ifdef LPF_ENABLE
    // 3kHz low pass filter
    LPF.put((q15_t*)buff, buffer_sample);
    LPF.get(pLPFSig, 0);
    FFT.put(pLPFSig, buffer_sample);
#else
    FFT.put((q15_t*)buff, buffer_sample);
#endif

    if (bInit) { bInit = false; continue; }

    // Using mutex to protect pDst array
    if (pthread_mutex_lock(&m) != 0) Serial.println("Mutex Lock Error");
    FFT.get(pDst, 0);
#ifdef SMA_ENABLE
    applySMA(pSMA, pDst);
#endif
    if (pthread_mutex_unlock(&m) != 0) Serial.println("Mutex UnLock Error");

  }
}

void setup() {
  int8_t sndid; 
  Serial.begin(115200);
  
  MP.begin(SUBCORE1);
  sndid = 101;
  MP.Send(sndid, FFT_LEN, SUBCORE1);
  MP.RecvTimeout(MP_RECV_POLLING); 


#ifdef LPF_ENABLE
  LPF.begin(TYPE_LPF, CHANNEL_NUM, LPF_CUTOFF, LPF_QVALUE);
#endif
  FFT.begin(WindowRectangle, CHANNEL_NUM, (FFT_LEN/2));
  
  theAudio->begin();
  // theAudio->setRecorderMode(AS_SETRECDR_STS_INPUTDEVICE_MIC, 200);
  theAudio->setRecorderMode(AS_SETRECDR_STS_INPUTDEVICE_MIC);
  int err = theAudio->initRecorder(AS_CODECTYPE_PCM ,"/mnt/sd0/BIN" 
                           ,AS_SAMPLINGRATE_48000 ,AS_CHANNEL_MONO);                             
  if (err != AUDIOLIB_ECODE_OK) {
    Serial.println("Recorder initialize error");
    while(1);
  }

  theAudio->startRecorder(); 
  Serial.println("Start Recording");
  task_create("audio recording", 120, 1024, audioReadFrames, NULL);
  sleep(1);
}

void loop() {
  int err, ret;
  int8_t sndid;

  // Using mutex to protect pDst array
  if (pthread_mutex_lock(&m) != 0) Serial.println("Mutex Lock Error");
  memcpy(pOut, pDst, buffer_size);
  if (pthread_mutex_unlock(&m) != 0) Serial.println("Mutex UnLock Error");

  // Using MPMutex to check the availablity of SubCore
  if (mutex.Trylock() != 0) { usleep(20000); return; }
  sndid = 100;
  err = MP.Send(sndid, &pOut, SUBCORE1);
  if (err < 0) Serial.println("MP Send error\n");
  mutex.Unlock();  
}



■ サブコアのスケッチ

#if (SUBCORE != 1)
#error "Core selection is wrong!!"
#endif

#define ARM_MATH_CM4
#define __FPU_PRESENT 1U
#include 

#include 
#include 
#include 

#include 
#include 

#define CS  10
#define DC   9   
#define RST  8
Adafruit_ILI9341 tft = Adafruit_ILI9341(CS, DC, RST);

MPMutex mutex(MP_MUTEX_ID0);

#define SPECTRO_WIDTH  (128)
#define SPECTRO_HEIGHT (320)
static uint16_t frameBuffer[SPECTRO_HEIGHT][SPECTRO_WIDTH];

#define DEBUG
// #define PSEUDO_COLOR

static uint16_t fft_len = 0;

float get_peak_frequency(float *pData, int fftLen)
{
  float g_fs = 48000.0f;
  uint32_t index;
  float maxValue;
  float delta;
  float peakFs;

  arm_max_f32(pData, fftLen / 2, &maxValue, &index);

  delta = 0.5 * (pData[index - 1] - pData[index + 1])
    / (pData[index - 1] + pData[index + 1] - (2.0f * pData[index]));
  peakFs = (index + delta) * g_fs / (fftLen - 1);

  return peakFs;
}

void setup() {
  int8_t recvid;
  uint32_t msg; 
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(35, 210);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println("FFT Spectrogram Viewer");
  tft.setTextColor(ILI9341_BLUE);
  tft.setTextSize(2);
  tft.setCursor(35, 35);
  tft.print("Peak FS:");
  tft.setCursor(210, 35);
  tft.print("Hz");
  tft.setRotation(2);
  memset(frameBuffer, 255, SPECTRO_WIDTH*SPECTRO_HEIGHT*sizeof(uint16_t));

  MP.begin();

  MP.Recv(&recvid, &msg);
  fft_len = msg;
  MPLog("%d FFT_LEN %d\n", recvid, fft_len);
  MP.RecvTimeout(MP_RECV_POLLING); 
}

void loop() {

  // based on CXD5247 technical manual
  static const float spr_signal_noise_ratio = 90.0; // SNR 
 
  static uint16_t colormap[] = {
    ILI9341_MAGENTA,
    ILI9341_BLUE,
    ILI9341_CYAN,
    ILI9341_GREEN,
    ILI9341_YELLOW,
    ILI9341_ORANGE,
    ILI9341_RED,
    ILI9341_WHITE
  };
  
  int8_t msgid;
  float *data;
  int ret, i, j;
  float f_max, f_min;
  
  ret = MP.Recv(&msgid, &data);
  if (ret < 0)  return;

  // Using MPMutex to notify MainCore that SubCore is in busy
  do { ret = mutex.Trylock(); } while (ret != 0);

#ifdef DEBUG
  f_max = 0.0;
  f_min = 1000.0;
  for (i = 0; i < fft_len/2; ++i) {
    float val = abs(data[i]);
    // MPLog("[%d] %f\n", i, val);
    if (val == 0.0) continue;
    if (val > f_max) f_max = val;
    if (val < f_min) f_min = val;
  }
  MPLog("RANGE: %3.6f - %+3.6f\n", f_max, f_min);
#endif
  
  f_max = -1000.0;
  f_min =  1000.0;
  for (i = 0; i < fft_len/2; ++i) {
    // if (!isnan(data[i]) && data[i] > 0.0) { 
    if (data[i] != 0.0) { 
      data[i] = 20.*log10(abs(data[i])) + spr_signal_noise_ratio;
      if (data[i] > f_max) f_max = data[i];
      if (data[i] < f_min) f_min = data[i];
    } 
  }
  MPLog("Range: %3.6f - %3.6f\n\n", f_max, f_min);

  for (i = 1; i < SPECTRO_HEIGHT; ++i) {
    for (j = 0; j < SPECTRO_WIDTH; ++j) {
      frameBuffer[i-1][j] = frameBuffer[i][j];
    }
  }

  // display range:0:0Hz - 200:9.375kHz
  for (i = 0; i < SPECTRO_WIDTH; ++i) {
    float f_val = data[i];
#ifdef PSEUDO_COLOR
    static const float magnify = 1;
    uint8_t index = magnify*f_val/32; 
    frameBuffer[SPECTRO_HEIGHT-1][i] = colormap[index];
#else
    uint16_t val_6, val_5;
    val_6 = (uint32_t)(f_val) * 64 / 256;
    val_5 = (uint32_t)(f_val) * 32 / 256;
    uint16_t val = val_5 << 11 | val_6 << 5 | val_5; 
    frameBuffer[SPECTRO_HEIGHT-1][i] = val;
#endif
  }
  
  tft.drawRGBBitmap(40, 0, (uint16_t*)frameBuffer, SPECTRO_WIDTH, SPECTRO_HEIGHT);

  uint16_t peak_fs = get_peak_frequency(data, fft_len);

  static int g_counter = 0;

  if (g_counter % 10 == 0) {
    char num_buf[8];
    tft.setRotation(3);
    tft.setTextColor(ILI9341_BLUE);
    tft.setTextSize(2);
    tft.setCursor(140, 35);
    tft.fillRect(140, 35, 60, 15, ILI9341_BLACK);
    sprintf(num_buf, "%05d", peak_fs);
    tft.print(num_buf);
    tft.setRotation(2);
    g_counter = 1;
  } else {
    ++g_counter;
  }

  mutex.Unlock();
}



次はどうやって学習データを記録していくか考えたいと思います。
(。-`ω´-)ンー





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



Voice Assistant Using SONY Spresense (English Edition)

Voice Assistant Using SONY Spresense (English Edition)

  • 作者: Perez, Guillermo
  • 出版社/メーカー:
  • 発売日: 2019/03/11
  • メディア: Kindle版




nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

息子、大学で講義を受けることなく夏休みに突入! [4コマ漫画]

息子が下宿をはじめてから1ヶ月半ほど。結局、講義はすべてオンライン。試験もオンライン。ほとんど大学へ行くことはありませんでしたが、夏休みが始まったので息子を迎えにいきました。

初めての一人暮らしだったので、どれだけ部屋が汚れているかなと思ったのですが、意外にも整理整頓されていてキレイに使っていました。さすが理系の学生だけはあるとカミさんが感心したのもつかの間…


帰省.png


台所があまり使われた形跡がないと思ったら、ゴミ箱はほとんどインスタントかレトルト食品。前回、カミさんが家事料理を一通り仕込んだはずなのですが、”ご飯を炊くのがめんどくさい”という理由でほとんど食事はレンチンかインスタント食品。

家に帰ったら、この夏休みの間にカミさんにみっちりシゴカれそうです。
( ̄▽ ̄;)





学生のための一人前!レシピ―カンタン・節約自炊のススメ

学生のための一人前!レシピ―カンタン・節約自炊のススメ

  • 出版社/メーカー: 京都新聞出版センター
  • 発売日: 2020/08/17
  • メディア: 単行本



マンガ・イラストでわかる! これで安心! ひとり暮らしガイド

マンガ・イラストでわかる! これで安心! ひとり暮らしガイド

  • 出版社/メーカー: 池田書店
  • 発売日: 2018/02/02
  • メディア: 単行本



極上ずぼら飯

極上ずぼら飯

  • 作者: だれウマ
  • 出版社/メーカー: ワニブックス
  • 発売日: 2020/02/26
  • メディア: 単行本(ソフトカバー)




タグ:日常
nice!(27)  コメント(0) 
共通テーマ:趣味・カルチャー

ACアダプター届いた!&お盆なので心霊現象について調べてみた [トンデモ学説]

ACアダプターようやく届きました。故障品はなぜ壊れたのか?壊れた場所もまったく不明ですが、とりあえず現状復帰できたのでよかったです。8,000円近い出費は痛かったですけど…。


sDSC_1018.jpg


で、お盆なので心霊現象を科学的に検証したサイトを読み漁ってみました。まずはこちらのサイト。


悪魔から幽霊まで、10の超常現象を科学的に説明する
http://karapaia.com/archives/52260765.html
mig.png



心霊現象を全力否定する内容です。夢もロマン?もないですね。さらに、幽霊の気配については、次のサイトで科学的に再現することに成功しています。(目隠しをして複数の触覚を与えることで、脳に錯覚をおこさせるというかなり限定的な方法ですが)


幽霊の正体が明らかに? 科学実験で「得体の知れない存在」の誘発に成功
https://www.excite.co.jp/news/article/Tocana_201412_post_5203/
control.png


これだけでは科学技術大勝利!でつまらないなーと思ったのですが、科学振興機構のサイトに興味深い論文がありました。


心霊 現 象に おける実証 的研究(PDF)
https://www.jstage.jst.go.jp/article/jsppj/10/1-2/10_KJ00003991209/_pdf/-char/ja
photo_shinrei_syashin.png


この論文は映像プロデューサーが書いたものなので、多少割り引いて読む必要はありますが、論文という体裁をとっているので、できるだけ客観的に記述されています。論文中で、心霊現象について次の観点で検証と考察を行っています。

(1)暗示錯覚説:長時間、霊を見たという人もおり、単なる錯覚とは言い難いと結論。
(2)磁場説:霊が出るといわれている場所で強い磁場異常が見られた。
(3)電圧効果説:日常的に強い磁場・磁気が発生することを考えると説得力を欠く。
(4)暗示幻覚説:意識が記憶がはっきりしている中で幻覚を見るという例もあり断定し難い。
(5)ESP幻覚説:ESP能力者がいるかどうかも分からないため説明に無理がある。
(6)因果関係説:霊が出る所に過去何かあったところが多く、電場に異常が見られる事が多い。


ということで、幽霊の出現と電磁波の異常について何かしら因果関係があることを示唆しています。さらに興味深いのは、霊能者と一般人が事故現場写真を見た時の反応の比較です。面白いので原文をそのまま引用します。


実験としては霊視能力者と一般人に各々2枚の写真を見せ(2枚とも見た目には何の変哲もない風景写真だが、その内1枚は殺人事件現場跡の写真)大脳皮質のどの領域に反応があるかという測定である。一般人の反応は2枚とも変化なかったが、霊視能力者は問題の写真で大きな反応が後頭葉の視覚野に現れ、視覚像が構成されているように思われる。



他にも検証をしていますが、この論文の要旨としては、①心霊現象が発生するところに磁場異常があることが多い。②霊能力者は心霊現象が発生しているところでは、脳内に何かしらの映像を形成しているらしいということが分かった。という2点に集約できると思います。

心霊現象はサイエンスの対象とはされていないので、これからも謎が解明されることはないと思いますが、それはそれで夏の風物詩として残り続けてほしいものですね。😉








心霊物件に住んじゃった (本当にあった笑える話)

心霊物件に住んじゃった (本当にあった笑える話)

  • 作者: 十凪高志
  • 出版社/メーカー: ぶんか社
  • 発売日: 2016/11/17
  • メディア: Kindle版



心霊目撃談現 (竹書房怪談文庫)

心霊目撃談現 (竹書房怪談文庫)

  • 作者: 三雲央
  • 出版社/メーカー: 竹書房
  • 発売日: 2019/10/28
  • メディア: Kindle版





タグ:日常
nice!(30)  コメント(0) 
共通テーマ:趣味・カルチャー

【悲報】PCのACアダプターが壊れる (´;ω;`) [徒然日記]

PCのACアダプターが壊れてしまい、急きょ古いPCを立ち上げてこのブログ書いてます。(´;ω;`)
久しぶりに立ち上げると、ひたすらWindows Updateが動いて半日くらい使い物になりませんでした。


WindowsUpdate.png


で、故障したPCは、深層学習を試すために購入した、HPのGPU付きのゲーミングノートPC 「OMEN 15」というかなりハイスペックな代物です。深層学習のスピードはデスクトップのワークステーションに匹敵する速さです。


HPOMEN15.png


ACアダプターはノートPCとしては規格外の「200W」!あまり一般的ではありません。こんな貴重な代物が1年ちょっとで簡単に壊れるとは。少し前に近くに雷が落ちたので、そのせいかなぁ。最近、ジジジジっていやな音してたし。


HPslimsmartacadaptor.png


残念ながら保証期間は過ぎていたので購入しようとしたら、なんとHPの公式ストアで販売していない!確かにマイナーな製品だけど、それはないんじゃない?(#`_´)

Amazonにもないし、グーグル先生を駆使して、ようやく販売しているところ発見。するとACアダプタだけで7700円!えーーー。200W も必要な電源なので仕方ないかも知れませんが、ACアダプタに8000円近くかぁ。


komatta_man2.png


でも、せっかく作ったソフトウェアや学習用データを無駄にするわけでもないのでポチりました。早く届くといいけどなぁ。
(´・ω・`)








GPU 並列図形処理入門――CUDA・OpenGLの導入と活用 Software Design plus

GPU 並列図形処理入門――CUDA・OpenGLの導入と活用 Software Design plus

  • 作者: 乾正知
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/02/25
  • メディア: Kindle版



ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)




タグ:omen 日常 HP
nice!(26)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE でスペクトログラム出力をしてみた [SPRESENSE]

前回、Python でスペクトログラム出力を検討しましたが、今回は SPRESENSE でスペクトログラム出力ができるようにしました!


DSC_1018.JPG


画質は悪いですが、動作している様子をTwitterにあげました。そのうちYoutubeにもあげたいと思います!





このプログラムは、最近新しく追加されたSPRESENSEの Signal Processing ライブラリを使いました。もう少しリファインが必要ですがコードを晒します。表示を少しでも早くするために、信号処理と表示をサブスコアを使って並行処理にしています。

こんな芸当ができるのも、SPRESENSEならではですね。(^^)/~


■ メインコアのスケッチ
#ifdef SUBCORE
#error "Core selection is wrong!!"
#endif

#include <MP.h>
#include <MPMutex.h>
#include <pthread.h>
#define SUBCORE1 1

MPMutex mutex(MP_MUTEX_ID0);
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

#include <Audio.h>
#include <FFT.h>
#include <IIR.h>
#define FFT_LEN 1024
#define SMA_WINDOW 8
#define CHANNEL_NUM 1
#define LPF_CUTOFF 3000
#define LPF_QVALUE 0.70710678

FFTClass<CHANNEL_NUM, FFT_LEN> FFT;
IIRClass LPF;

AudioClass *theAudio = AudioClass::getInstance();
static const int32_t buffer_sample = FFT_LEN;
static const int32_t buffer_size = buffer_sample * sizeof(int16_t);
static char buff[buffer_size];
uint32_t read_size;

static float pDst[FFT_LEN];
static float pOut[FFT_LEN/2];
static float pSMA[SMA_WINDOW][FFT_LEN];


void applySMA(float sma[SMA_WINDOW][FFT_LEN], float dst[FFT_LEN]) 
{
  int i, j;
  static int g_counter = 0;
  if (g_counter == SMA_WINDOW) g_counter = 0;
  for (i = 0; i < FFT_LEN; ++i) {
    sma[g_counter][i] = dst[i];
    float sum = 0;
    for (j = 0; j < SMA_WINDOW; ++j) {
      sum += sma[j][i];
    }
    dst[i] = sum / SMA_WINDOW;
  }
  ++g_counter;
}

static void audioReadFrames() {
  int err, ret;
  static int g_counter = 0;
  static q15_t pLPFSig[FFT_LEN];
  
  while(1) {
    err = theAudio->readFrames(buff, buffer_size, &read_size);
    if (err != AUDIOLIB_ECODE_OK && err != AUDIOLIB_ECODE_INSUFFICIENT_BUFFER_AREA) {
      Serial.println("Error err = " + String(err));
      theAudio->stopRecorder();
      exit(1);
    }

    if (read_size < buffer_size) {
      usleep(10000);
      continue;
    }

    // 3kHz low pass filter
    LPF.put((q15_t*)buff, FFT_LEN);
    LPF.get(pLPFSig, 0);

    // FFT
    FFT.put(pLPFSig, FFT_LEN);
    // Using mutex to protect pDst array
    if (pthread_mutex_lock(&m) != 0) Serial.println("Mutex Lock Error");
    FFT.get(pDst, 0);
    applySMA(pSMA, pDst);
    if (pthread_mutex_unlock(&m) != 0) Serial.println("Mutex UnLock Error");
    
    usleep(8000);
  }
}

void setup() { 
  Serial.begin(115200);
  MP.begin(SUBCORE1);
  MP.RecvTimeout(MP_RECV_POLLING); 

  LPF.begin(TYPE_LPF, CHANNEL_NUM, LPF_CUTOFF, LPF_QVALUE);
  FFT.begin(WindoHanning, 1, (FFT_LEN/4));
  
  theAudio->begin();
  theAudio->setRecorderMode(AS_SETRECDR_STS_INPUTDEVICE_MIC, 200);
  int err = theAudio->initRecorder(AS_CODECTYPE_PCM ,"/mnt/sd0/BIN" 
                           ,AS_SAMPLINGRATE_48000 ,AS_CHANNEL_MONO);                             
  if (err != AUDIOLIB_ECODE_OK) {
    Serial.println("Recorder initialize error");
    while(1);
  }

  theAudio->startRecorder(); 
  Serial.println("Start Recording");
  task_create("audio recording", 120, 1024, audioReadFrames, NULL);
  sleep(1);
}

void loop() {
  int err, ret;
  int8_t sndid;

  // Using mutex to protect pDst array
  if (pthread_mutex_lock(&m) != 0) Serial.println("Mutex Lock Error");
  memcpy(pOut, pDst, buffer_size /2);
  if (pthread_mutex_unlock(&m) != 0) Serial.println("Mutex UnLock Error");

  // Using MPMutex to check the availablity of SubCore
  if (mutex.Trylock() != 0) { usleep(20000); return; }
  sndid = 100;
  err = MP.Send(sndid, &pOut, SUBCORE1);
  if (err < 0) Serial.println("MP Send error\n");
  mutex.Unlock();  
}



■ サブスコアのスケッチ
#if (SUBCORE != 1)
#error "Core selection is wrong!!"
#endif

#include <MP.h>
#include <MPMutex.h>

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>

#define CS  10
#define DC   9   
#define RST  8
Adafruit_ILI9341 tft = Adafruit_ILI9341(CS, DC, RST);

MPMutex mutex(MP_MUTEX_ID0);

#define FFT_LEN 1024
#define SPECTRO_WIDTH (FFT_LEN/8)
#define SPECTRO_HEIGHT (320)
static uint16_t frameBuffer[SPECTRO_HEIGHT][SPECTRO_WIDTH];

void setup() {
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(35, 210);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(2);
  tft.println("FFT Spectrogram Viewer");
  tft.setRotation(2);
  memset(frameBuffer, 255, SPECTRO_WIDTH*SPECTRO_HEIGHT*sizeof(uint16_t));

  MP.begin();
  MP.RecvTimeout(MP_RECV_POLLING); 
}

void loop() {

  // based on CXD5247 technical manual
  static const float spr_signal_noise_ratio = 90.0; // SNR 
 
  static uint16_t colormap[] = {
    ILI9341_MAGENTA,
    ILI9341_BLUE,
    ILI9341_CYAN,
    ILI9341_GREEN,
    ILI9341_YELLOW,
    ILI9341_ORANGE,
    ILI9341_RED,
  };
  
  int8_t msgid;
  float *data;
  int ret, i, j;
  
  ret = MP.Recv(&msgid, &data);
  if (ret < 0)  return;

  // Using MPMutex to notify MainCore that SubCore is in busy
  do { ret = mutex.Trylock(); } while (ret != 0);
  for (i = 0; i < FFT_LEN/2; ++i) {
    if (!isnan(data[i]) && data[i] > 0.0) { 
      data[i] = 20.*log10(data[i]) + spr_signal_noise_ratio;
    } else {
      data[i] = 0.0; // under the noise level?
    }
  }

  for (i = 1; i < SPECTRO_HEIGHT; ++i) {
    for (j = 0; j < SPECTRO_WIDTH; ++j) {
      frameBuffer[i-1][j] = frameBuffer[i][j];
    }
  }

  // display range:0:0Hz - FFT_LEN/8(128):6kHz
  static const float magnify = 1.0; // To magnify the signal
  for (i = 0; i < SPECTRO_WIDTH; ++i) { 
    uint8_t index = magnify*data[i]/32; 
    frameBuffer[SPECTRO_HEIGHT-1][i] = colormap[index];
  }
  
  tft.drawRGBBitmap(40, 0, (uint16_t*)frameBuffer, SPECTRO_WIDTH, SPECTRO_HEIGHT);
  mutex.Unlock();
}






サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)

サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)

  • 作者: 青木 直史
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/02/01
  • メディア: 単行本(ソフトカバー)



SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware




nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。