スーパープレッシャー気球が次の宇宙時代を切り拓く? [トンデモ学説]
長時間飛翔用スーパープレッシャー気球の開発と実証
http://www.isas.jaxa.jp/home/kougaku/03_report/2019_senryaku/24_saito_senryaku_report_2019.pdf
と、思ったけど研究費が数百万って、しょぼ・・・。しょぼすぎる。(´・ω・`)
なぜ、今「スーパープレッシャー気球」なのか?通常の気球は太陽に熱せられると内部の気体が膨張し気球を圧迫します。そのダメージを避けるため、内部の気体を逃し気圧を下げます。一方で夜になると冷えるので、バラストを投下して高度を維持します。
これを「ゼロプレッシャー気球」と呼びますが、どんどん内部のリソースを削っていくので、あっという間に気球が使えなくなります。それを克服するのが「スーパープレッシャー気球」です。
「スーパープレッシャー気球」は軽量で高強度の繊維で作られた気球で、気体の膨張にも耐えられるため、内部の気体を放出する必要ありません。繊維開発はグンゼやフジクラが担当しているようですね。
スーパープレッシャー気球の性能試験を実施
http://www.isas.jaxa.jp/j/snews/2006/0209.shtml
2016年にはNASAが「スーパープレッシャー気球」で46日ものロングフライトを実現。機材回収優先のため、この日数になったようで、気球そのものは100日を超えることも可能な状態だったようです。
【高論卓説】NASA「スーパープレッシャー気球」
https://www.sankeibiz.jp/business/news/170510/bsc1705100500011-n2.htm
高度50kmの成層圏で落ちない気球が実現できると世界は大きく変わります。携帯の基地局も減らせますし、衛星よりも細かく行えるセンシングが農業や交通、設備管理を大きく変えるでしょうし、また天気予報もより細かいレベルで行うことができます。
そして「スーパープレッシャー気球」の技術は、そのまま「ロックーン」にも使えますので小型衛星の打ち上げのコストダウンにも寄与できます。さらにはISSへの中継地点になるかも知れません。
ということを考えていたら、すでにアメリカではビジネスにしている会社があるのですね。(さすがにスーパープレッシャー気球ではないようですが)
https://worldview.space/
さすがアメリカだなぁ。しかも繁盛していそう。このようなサービスで着実にビジネスを伸ばしながら宇宙開発への足掛かりも作っていく。そんな実践型の日本の先端企業が出てこないかな。
(´・ω・`)
気球工学―成層圏および惑星大気に浮かぶ科学気球の技術 (宇宙工学シリーズ)
- 出版社/メーカー: コロナ社
- 発売日: 2004/02/01
- メディア: 単行本
日本の軍用気球 知られざる異色の航空技術史 (光人社NF文庫)
- 作者: 佐山 二郎
- 出版社/メーカー: 潮書房光人新社
- 発売日: 2020/03/25
- メディア: 文庫
【朗報】息子の前期の成績は? [4コマ漫画]
ずっとコロナでオンライン授業・オンラインテストだったのでどうなることかと思いましたが、どうやら落単はなかったようです。それどころか、その結果は?
いやーほとんど”AA”か”A”。すごいなぁ。さすが一時期は最高学府を目指そうかと言っていただけはある。息子にはたしなめられましたが、スクショは息子に記念にもらったので、一部をここで公開しちゃいます。(親馬鹿でスイマセン…(∀`*ゞ))
この成績がずっと続けば、夢の宇宙工学の研究者に一歩近づくぞ。がんばれー!
(^^)/~
学びを結果に変えるアウトプット大全 (Sanctuary books)
- 作者: 樺沢紫苑
- 出版社/メーカー: サンクチュアリ出版
- 発売日: 2018/08/03
- メディア: 単行本(ソフトカバー)
【アフターコロナ】資本主義の次に来るものとは?「いいね!」主義の到来か? [トンデモ学説]
人類は資本主義を本当にこのまま続けられるか
https://toyokeizai.net/articles/-/313357?page=5
興味深いの読んでみました。雑に要約してみると、”今のまま消費中心の資本主義が行き過ぎるといつか破綻(ハードランディング)するだろう。そうならないためにはベーシックインカムの導入やモノやサービスを共有財産化していってはどうだろう?”という内容です。
”いつか破綻するだろう”というのは同意ですが、それを回避するのに社会主義を導入というところはどうなんですかねぇ?冷戦の時代に失敗しているのを”おかわり”するのもどうかと。
で、ここからはとんでも持論です。
私は資本主義の次には「いいね!」主義が到来すると予言します!
( ー`дー´)キリッ
冗談のようですが、結構まじめです。では、「いいね!」主義を解説しましょう。
人間の歴史を振り返って見ると、「投資」というのは、人間が社会生活を始めた古くから行われていた行為で、そうそう無くなるものではありません。
物々交換時代:
自分の欲しいモノと交換(リターン)するために、他の人たちが欲しがる何かを自分で探し出したり作り出す(投資)
金銀取引時代:
自分の欲しいモノと交換できる金銀(リターン)を得るために、他の人たちが欲しがる何かを探し出したり作り出す(投資)
貨幣取引時代:
自分の欲しいモノと交換できる貨幣(リターン)を得るために、他の人達が欲しがる何かを探し出したり作り出す(投資)
ここで、「金銀取引」から「貨幣取引」の移行で大きなジャンプがあります。紙切れというなんの価値のないものに価値を与えたというパラダイム・シフトが発生しました。金本位制がなくなったのは、ほんの数十年前の出来事なので、最近の話です。
で、アフターコロナはキャッシュレス化が進み「貨幣」さえもなくなる時代が来ます。
信用取引時代:
自分の欲しいものと交換できる信用貨幣(リターン)を得るために、他の人達が欲しがる何かを探し出したり作り出す(投資)
こうして見ると、いつの時代の人も(リターン)を得るために何かしら(投資)をするという行為を繰り返してきました。つまり、「所有」という概念は人の性なので社会主義は相容れることは出来ません。
では、その先はどうなるでしょう?このまま消費社会が続くのかというと、そうはならないというのが持論です。それを変えるのが「いいね!」です。
いいね!取引の未来:
自分の欲しいものと交換できる「いいね!」(リターン)を得るために、多くの人達に称賛される何かを探し出したり作り出したり行動する(投資)
「信用取引」から「いいね!」時代に転換するには、大きなパラダイム・シフトが必要です。しかし、それはすでに現在進行形で進んでいます。
最近は、科学技術が進んだため「自分の欲しいモノ」というのが少なくなってきています。世の中が便利になり生活に満足してきたわけですね。
一方で、多くの人は、SNSで代表されるように「いいね!」を欲しがるようになってきました。SNSで「いいね!」や、ゲームのポイントを集めるのに夢中になる人が増えてきています。「いいね!が欲しい」が「モノが欲しい!」に取って代わるようになってきたわけです。
さらに踏み込んで、「いいね!」で間接的に集めたポイント(アフィリエイト)は、モノや情報と交換できるようにもなってきています。
それがどんどん進んでくると、人々はより多くの「いいね!」を集めるためにボランティアや環境保護など、皆に称賛される社会貢献を率先して行うことになると思います。
そして、数多くのサービスが提供する「いいね!」を表すデジタルデータが経済の実体を牽引していくと「貨幣」という概念そのものが希薄になってきて、「貨幣」そのものが「いいね!」を表す多くの指標の一つになっていくことになると思います。
さらにもう一歩踏み込んで考えていくと、「いいね!」取引の境界が人と人を隔てる新たなボーダとなっていくかも知れません。まさにデジタルワールドの到来ですね、
新たな「いいね!」時代でも摩擦や争いが絶えることはないでしょう、でも人の行動原理が「貨幣を得たい」から「いいね!を得たい」という風に変わっていったら、きっと世界はもっと楽しく過ごしやすくなるんじゃないかなと思います。
アフターコロナも人類に幸あれ!(^^)/~
ポストコロナの資本主義 挑戦される国家・企業・通貨 (日本経済新聞出版)
- 作者: 岩村充
- 出版社/メーカー: 日経BP
- 発売日: 2020/08/21
- メディア: Kindle版
ポストコロナの「日本改造計画」 デジタル資本主義で強者となるビジョン
- 作者: 竹中 平蔵
- 出版社/メーカー: PHP研究所
- 発売日: 2020/07/30
- メディア: 単行本(ソフトカバー)
2025年のデジタル資本主義: 「データの時代」から「プライバシーの時代」へ (NHK出版新書 623)
- 作者: 田中 道昭
- 出版社/メーカー: NHK出版
- 発売日: 2020/05/11
- メディア: 新書
【コロナ状況分析定期】冬のオーストラリアの状況と比較する [徒然日記]
さて、最初に日本の最新の状況を確認しましょう。いつもの東洋経済さんのサイトからの引用です。
まず陽性者数ですがピークは超えているようです。ただ、お盆のGoToの影響がでてくるのはこれからなのであまり楽観はできないかと。
PCR検査人数もあまり増やす計画はないようですね。むやみに拡げても保健所や医療機関に負担をかけるので少し抑え気味にしているようです。
実効再生産数はかなり抑えられてきました。GoToがあるので拡がるかなと思ったのですが、皆さんかなり用心しているようですね。
入院患者はかなり減ってきているようです。ピークを超えたという判断の根拠はこの数字のようですね。
重傷者数もサチってきています。
死亡者数は残念ながら増加傾向です。これから下がる方向になるとは思いますが…。
年齢別の陽性者数は20代から80代まで正規分布のような拡がりになってきました。
さて、前回、冬に向かって感染ならびに死亡者数が増えてくるのではないか?という考察をしました。オーストラリアは今ちょうど冬です。しかも、医療水準が同じくらいですので良いベンチマークとなると思いデータを参照してみました。
まずオーストラリアの陽性者数ですが、日本と非常に似たような傾向となっています。数はだいたい東京都と同じくらいでしょうか。日本と同じく第二波はピークアウトしているようです。
https://www.worldometers.info/coronavirus/country/australia/
死亡者数も、同じくピークアウトしていますが、第一波に比べると死亡率は高くなっているようです。やはり冬の気候が影響しているのかも知れません。
https://www.worldometers.info/coronavirus/country/australia/
陽性者数の年齢別の分布ですが、20代をピークに日本と同じ様な分布となっています。
https://www.health.gov.au/news/health-alerts/novel-coronavirus-2019-ncov-health-alert/coronavirus-covid-19-current-situation-and-case-numbers
死亡者数の年齢別の分布です。やはり70代以上が顕著ですね。
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!コミックス)
- 作者: 小林 よしのり
- 出版社/メーカー: 扶桑社
- 発売日: 2020/08/20
- メディア: Kindle版
コロナ、戦争、危機管理 指導者たちの「失敗の本質」 (中央公論ダイジェスト)
- 出版社/メーカー: 中央公論新社
- 発売日: 2020/08/25
- メディア: Kindle版
【朗報】SPRESENSE の CircuitPython が "GPS"をサポート! [SPRESENSE]
■ 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" を発見!
早速、最新のツリーをCloneしてビルドしてみました。ビルドの仕方はこちらを参照してください。
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。位置情報が得られるようになると色々とアプリケーションを作る気が湧いてきます。
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 トラッカーが出来上がりそうです。
https://www.switch-science.com/catalog/5374/
これからのアップデートをさらに期待したいところですね!
( ^ω^ )/~
SONY SPRESENSE メインボード CXD5602PWBMAIN1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SONY SPRESENSE 拡張ボード CXD5602PWBEXT1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SPRESENSEスペクトログラムをアップデート!! [SPRESENSE]
実際の動きはこちらをご覧ください。
Spresense Spectrogram アップデートしました。
— よしのたろう (@Taro_Yoshino) August 18, 2020
FFTのポイント数は256~4096まで対応してますが、LCDの画面の都合上256にしました。Spresenseの計算能力はまだまだ余裕があるので、もっと高解像度いけそうです。 pic.twitter.com/6VNqNAttKA
スケッチはこちら。解析はメインコアで、表示はサブスコアで行っています。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
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SONY SPRESENSE 拡張ボード CXD5602PWBEXT1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
Voice Assistant Using SONY Spresense (English Edition)
- 作者: Perez, Guillermo
- 出版社/メーカー:
- 発売日: 2019/03/11
- メディア: Kindle版
息子、大学で講義を受けることなく夏休みに突入! [4コマ漫画]
初めての一人暮らしだったので、どれだけ部屋が汚れているかなと思ったのですが、意外にも整理整頓されていてキレイに使っていました。さすが理系の学生だけはあるとカミさんが感心したのもつかの間…
台所があまり使われた形跡がないと思ったら、ゴミ箱はほとんどインスタントかレトルト食品。前回、カミさんが家事料理を一通り仕込んだはずなのですが、”ご飯を炊くのがめんどくさい”という理由でほとんど食事はレンチンかインスタント食品。
家に帰ったら、この夏休みの間にカミさんにみっちりシゴカれそうです。
( ̄▽ ̄;)
マンガ・イラストでわかる! これで安心! ひとり暮らしガイド
- 出版社/メーカー: 池田書店
- 発売日: 2018/02/02
- メディア: 単行本
ACアダプター届いた!&お盆なので心霊現象について調べてみた [トンデモ学説]
で、お盆なので心霊現象を科学的に検証したサイトを読み漁ってみました。まずはこちらのサイト。
悪魔から幽霊まで、10の超常現象を科学的に説明する
http://karapaia.com/archives/52260765.html
心霊現象を全力否定する内容です。夢もロマン?もないですね。さらに、幽霊の気配については、次のサイトで科学的に再現することに成功しています。(目隠しをして複数の触覚を与えることで、脳に錯覚をおこさせるというかなり限定的な方法ですが)
幽霊の正体が明らかに? 科学実験で「得体の知れない存在」の誘発に成功
https://www.excite.co.jp/news/article/Tocana_201412_post_5203/
これだけでは科学技術大勝利!でつまらないなーと思ったのですが、科学振興機構のサイトに興味深い論文がありました。
心霊 現 象に おける実証 的研究(PDF)
https://www.jstage.jst.go.jp/article/jsppj/10/1-2/10_KJ00003991209/_pdf/-char/ja
この論文は映像プロデューサーが書いたものなので、多少割り引いて読む必要はありますが、論文という体裁をとっているので、できるだけ客観的に記述されています。論文中で、心霊現象について次の観点で検証と考察を行っています。
(1)暗示錯覚説:長時間、霊を見たという人もおり、単なる錯覚とは言い難いと結論。
(2)磁場説:霊が出るといわれている場所で強い磁場異常が見られた。
(3)電圧効果説:日常的に強い磁場・磁気が発生することを考えると説得力を欠く。
(4)暗示幻覚説:意識が記憶がはっきりしている中で幻覚を見るという例もあり断定し難い。
(5)ESP幻覚説:ESP能力者がいるかどうかも分からないため説明に無理がある。
(6)因果関係説:霊が出る所に過去何かあったところが多く、電場に異常が見られる事が多い。
ということで、幽霊の出現と電磁波の異常について何かしら因果関係があることを示唆しています。さらに興味深いのは、霊能者と一般人が事故現場写真を見た時の反応の比較です。面白いので原文をそのまま引用します。
実験としては霊視能力者と一般人に各々2枚の写真を見せ(2枚とも見た目には何の変哲もない風景写真だが、その内1枚は殺人事件現場跡の写真)大脳皮質のどの領域に反応があるかという測定である。一般人の反応は2枚とも変化なかったが、霊視能力者は問題の写真で大きな反応が後頭葉の視覚野に現れ、視覚像が構成されているように思われる。
他にも検証をしていますが、この論文の要旨としては、①心霊現象が発生するところに磁場異常があることが多い。②霊能力者は心霊現象が発生しているところでは、脳内に何かしらの映像を形成しているらしいということが分かった。という2点に集約できると思います。
心霊現象はサイエンスの対象とはされていないので、これからも謎が解明されることはないと思いますが、それはそれで夏の風物詩として残り続けてほしいものですね。😉
幽霊を創出したのは誰か? Who Created the Ghost? WWシリーズ (講談社タイガ)
- 作者: 森博嗣
- 出版社/メーカー: 講談社
- 発売日: 2020/06/18
- メディア: Kindle版
【悲報】PCのACアダプターが壊れる (´;ω;`) [徒然日記]
久しぶりに立ち上げると、ひたすらWindows Updateが動いて半日くらい使い物になりませんでした。
で、故障したPCは、深層学習を試すために購入した、HPのGPU付きのゲーミングノートPC 「OMEN 15」というかなりハイスペックな代物です。深層学習のスピードはデスクトップのワークステーションに匹敵する速さです。
ACアダプターはノートPCとしては規格外の「200W」!あまり一般的ではありません。こんな貴重な代物が1年ちょっとで簡単に壊れるとは。少し前に近くに雷が落ちたので、そのせいかなぁ。最近、ジジジジっていやな音してたし。
残念ながら保証期間は過ぎていたので購入しようとしたら、なんとHPの公式ストアで販売していない!確かにマイナーな製品だけど、それはないんじゃない?(#`_´)
Amazonにもないし、グーグル先生を駆使して、ようやく販売しているところ発見。するとACアダプタだけで7700円!えーーー。200W も必要な電源なので仕方ないかも知れませんが、ACアダプタに8000円近くかぁ。
でも、せっかく作ったソフトウェアや学習用データを無駄にするわけでもないのでポチりました。早く届くといいけどなぁ。
(´・ω・`)
HP Omen 15-ce019dx 15.6 FHD i7-7700HQ NVIDIA GTX 1050 Ti 8GB RAM 1TB HDD 128GB NVMe SSD [並行輸入品]
- 出版社/メーカー:
- メディア: エレクトロニクス
GPU 並列図形処理入門――CUDA・OpenGLの導入と活用 Software Design plus
- 作者: 乾正知
- 出版社/メーカー: 技術評論社
- 発売日: 2014/02/25
- メディア: Kindle版
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤 康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
SPRESENSE でスペクトログラム出力をしてみた [SPRESENSE]
画質は悪いですが、動作している様子をTwitterにあげました。そのうちYoutubeにもあげたいと思います!
Spresense の Spectrogram出力。表示を少し高速化(とは言っても20msecは大きい)。いい感じで出力できるようになってきた。ただ、時々線が出ているのが気になる。もう少し解析が必要だな。 pic.twitter.com/uSbYSpPO7M
— よしのたろう (@Taro_Yoshino) August 4, 2020
このプログラムは、最近新しく追加された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)
- 作者: 青木 直史
- 出版社/メーカー: 技術評論社
- 発売日: 2013/02/01
- メディア: 単行本(ソフトカバー)
SONY SPRESENSE メインボード CXD5602PWBMAIN1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware
SONY SPRESENSE 拡張ボード CXD5602PWBEXT1
- 出版社/メーカー: スプレッセンス(Spresense)
- メディア: Tools & Hardware