Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

PCMにWAVヘッダを付ける

  • WAVヘッダを付けると便利
  • WAVヘッダのテンプレート
    • リニアPCM16ビット、サンプリング周波数16kHz(モノラル)のWAVヘッダ
    • WAVヘッダを取得するAPI
  • 使い方
    • ファイルサイズを求めるAPI
    • サンプルコード
  • Audacityでファイル読み込み
  • 最後に

WAVヘッダを付けると便利

音声データをPCMファイルとして扱う場合、再生するためには、サンプリング周波数、チャネル数、量子化ビット数を再生ツールに教えなければなりません。こんな時は、WAV【RIFF Waveform Audio Format】ヘッダを付けると便利で、簡単な方法でWAVヘッタを付けたいと思うことがあります( オーディオファイルのフォーマットについては こちら)。

続きを読む

思考のサルベージ(その9)

各工程で心がけたい思想を掘り起こしてみる

以前「ハードウェアインターフェース」について考えてみました。今回も詳細設計・実装におけるHWの利用方法について考えてみます。

事前実験

  • 2BYETデータA[可変]、4BYTEデータB[可変]を連結する。
  • 2BYTEのチェックサムを付与し、8BYTEのデータをメモリ上に生成する。
  • これを512回繰り返し、8BYTE×512=4KBのデータを生成する。ただし、データBは先頭から[+1]インクリメントする。

上記の処理を、ある処理シーケンスの中に実装するとします。ただし、この処理シーケンスはスピードを求められているので、事前に実験コードを作成し、処理速度の見積もりを出しました。実験では許容範囲の処理性能を出すことができました。

本実装

実験コードを製品版に反映します。実験の時には明確になっていなかった仕様や制限事項をコードに反映しなければならないので実験結果に比べ多少のオーバーヘッドが加算されることは予想できました。 都合の良いことに以下のようなHWサポートが使用できることがわかりました。処理性能は向上が見込めるので早速コードに取り入れました。

  • 2BYETデータA[可変]、4BYTEデータB[可変]、処理回数をレジスタに設定する。
  • 4BYTEデータB[可変]はレジスタ設定値から処理回数に応じて[+1]インクリメントする
  • 2BYETデータA[可変]はレジスタ設定値レジスタ設定値をそのまま使用する
  • 2BYTEのチェックサムを付与し、8BYTEのデータを生成する。
  • 処理回数×8BYTEのデータをDataBusを介してメモリ上に作成する

HWサポート導入による性能劣化

本実装で性能測定をしたところ、実験結果と比較して大幅な性能劣化が見られました。処理シーケンス内のどこで処理時間がかかっているか確認したところ、まさにHWサポートを導入したところでした。

  • これを512回繰り返し、合計4KBのデータを生成する。

ここがポイントでした。 本実装に導入したHWサポートでは、4BYTEデータB[可変]はHWで更新してもらえますが、 2BYETデータA[可変]はレジスタ設定値がそのままHW内使用で使用されてしまうのでSWで512回生成しなければなりません。結果的にHWを起動する回数も512回となります。 HWにも前処理・後処理のオーバーヘッドが乗るので、512回に及ぶHW起動・終了がそのまま処理性能に影響していました。処理回数「1」のケースでは、データ生成処理でHWのやることは「チェックサムの生成」だけなので、いくらDataBusを介してメモリアクセスしても処理速度の向上はたかが知れています。

導入したHWサポートは大量のデータを取り扱う時にこそ威力を発揮するもので、データ量が少ない場合は効果の期待できないものでした。

何か掘り起こせた?

  • HW機能には、向き・不向きがある。
  • 仕様に対して、HWサポートが有効か考慮が必要。

HWは速いと思い込んでいると、痛い目にあいますね。

おしまい

もともとの仕様では2BYETデータA[可変]は、固定だったんですけどね。そのうえでのHWサポートでしたから。このHW機能使われずじまいでした。

Linux Mint 20 Ulyana 初期セットアップ手順

6月27日に「Linux Mint」の最新メジャーリリースとなるバージョン20(開発コード「Ulyana」)がリリースされました。 「Linux Mint」はUbuntuベースのデスクトップ型Linuxディストリビューションのひとつです。
私はVMware上に「Linux Mint」をセットアップし、システム開発環境として普段は利用していますが、当記事では64bitのWindows上にVMware Workstation Playerをインストールし、VMware上に「Linux Mint 20 Mate」をインストールして稼働させるまでの流れを紹介します。
※「Mate」は「Linux Mint」の3タイプのうち、軽量・シンプルな構成のタイプです。

目次

  1. 「Linux Mint」イメージファイルのダウンロード
  2. VMware Workstation Playerインストーラのダウンロード
  3. VMware Workstation Playerのインストール
  4. 「Linux Mint」を起動するVMwareの初期設定
  5. VMwareで「Linux Mint」をインストール
  6. 「Linux Mint」開発環境向け初期設定
続きを読む

Amazon Honeycodeを使ってみた(その1)

はじめに

コードをまったく書かずにウェブ・モバイルアプリを構築することができるという「Amazon Honeycode」のベータ版が公開されました。
どんなものなのか興味があり、無料で試せるということで少し触ってみようと思います。

続きを読む

PyTorchで学ぶ『平均』と『分散』と『BatchNormalization』

ところでBatchNormalizationってなんだっけ?

深層学習でモデル構築をしていると、よくお見かけするのがBatchNormalizationと呼ばれるもの。

・・・はい。よく見かけますよね?

・・・・・・・・・。

ところで、結局それってなんでしたっけ?

「平均を0、分散を1」という説明はよく聞きますけど、それは結局どういうことなのか?
というのが今日のお題です。

ちなみにですけど、この記事を書いてる人間は、本ブログで度々統計のことについて語っていらっしゃる統計学スペシャリストとは別の人間です。どちらかというと統計学は素人に近い(?)ので、『え、そこから???』などと言わず、温かい目で読んでいただけたらと思います。
(使用しているのがNumpyではなくPyTorchという辺りがお察しですね・・・)

続きを読む

GitHub Wiki でのファイル添付

はじめに

みんな大好き GitHub。issue や PR に補足資料としてパワポやエクセルのファイル、イメージを張り付けるなんてことは良くやります。この場合、Edit 欄にファイルを Drag & Drop するだけで自動的にアップロードしてリンク作成されるのですが、同じノリで Wiki ページにも貼り付けようとすると、、これができません。

さてどうすれば?

続きを読む

FIRフィルタを作って周波数特性を検証

適応フィルタを作ってみる では、サンプルコードを紹介しましたが、実際に動かしてみたいと思います。そこで適応フィルタの前に、まずはシンプルに固定フィルタを検証してみます。

  • FIRフィルタ
    • サンプルコード
  • 検証用のコード
    • サンプルコード
  • フィルタスルーで動作確認
    • Audacityで正弦波を作ってフィルタに入力
    • 実行方法
      • AudacityでPCMファイルの読み込み
  • ローパスフィルタを検証

FIRフィルタ

f:id:jspnet:20200306005824p:plain:right:w600 適応フィルタを作ってみる で使用したFIR【Finite Impulse Response】のサンプルコードを、まずは固定フィルタで検証してみます。

{
 y(n) = \sum_{k=0}^{N}h_k x(n-k)
}


続きを読む