質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • C

    3201questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3014questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • アルゴリズム

    355questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

  • 関数

    187questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

  • MATLAB

    125questions

    MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

MATLABでフレーム単位でオーディオデータを取得し、部分的に復調するコードのエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 187

ranranway

score 172

前提・実現したいこと

MATLABでフレーム単位でオーディオデータを取得し、部分的に復調しようとしています。
長いオーディオデータを処理するために、並行してデータの取得と復調を行うことが目的です。以下の2つのサイトを参考にしています。

参考サイト1
参考サイト2
参考サイト2では、「コンポーネントの作成と構成の同時実行」と「システムでのコンポーネントの接続」部分を参考にしています。

発生している問題・エラーメッセージ

以下のような設計を予定していますが、既存のオーディオデータを全て読み込んでから復調するコードを以下のコードにどのように適用させていけば良いかわからず、悩んでいます。
アドバイスをいただけましたら幸いです。

audioRead = dsp.AudioFileReader(...
    'sample.wav',...
    'SamplesPerFrame',framesize);
deviceWriter = audioDeviceWriter(...
    'SampleRate',Fsa);

while  ~isDone(fileReader)
    signal = audioRead();

    deviceWriter(s);
end

該当のソースコード

オーディオデータを全て読み込んでから復調するコード(実装済)

%% 復調
Fs = 20000; %audio out sampling
Fc = 5000;   %搬送波周波数
[yy, Fss] = audioread('sample.wav');%ファイルを読む
[n,d] = rat(Fss/Fs);%再標本化レート
[r,c] = size(yy);

t = (0:1/Fss:r/Fss-1/Fss);%0~2秒
f = (Fss/r:Fss/r:Fss);%周波数成分
yc = cos(2*pi*Fc*t);

z2c = yy' .* yc; %復調
Rp  = 0.00057565; % 0.01 dB リップル
Rst = 1e-6;       % 80 dB 阻止域の減衰
eqnum = firceqrip(20,Fc/(Fss/2),[Rp Rst],'passedge');

fvtool(eqnum,'Fs',Fss,'Color', 'White') %フィルターの可視化

lowpassFIR = dsp.FIRFilter('Numerator', eqnum); %ローパスフィルター(低域通過濾波器)
z = lowpassFIR(z2c');
fz = resample(z, d, n); %サンプリングレートの変更

sound(fz, Fs);

補足情報(言語/FW/ツール等のバージョンなど)

MatlabR2017b

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

キューを適用してはいかがでしょうか?
キュー

MATLABは使ったことないので正直良くわからないのでコードは提示できませんが、手順としては次のようになると思います。

  • audioReadとdeviceWriterを実行するループをそれぞれ別スレッドに分ける。
  • audioReadで取得した取得したsignalをキューにPUSHする。
  • deviceWriterを実行しているスレッドはsignalキューからPOPして復調を実施する。

イメージ的にはaudioReadで取得した信号をキューという箱に適当なタイミングで放り込んでいって、deviceWirterは箱に信号が入っていれば投入された順番に沿って取り出して復調していくような感じですね。
この時注意しなければいけないのは、箱から取り出す頻度よりも入れる頻度のほうが多い場合はいつか
箱が溢れてしまうということです。

各々のループが起動するタイミングや頻度はranranwayさんがプログラムで解決したい課題によって決まりますので、箱の大きさはranranwayさんが決める事項です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 12:34 編集

    丁寧にご回答いただきましてありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    MATLABでの点と線の描画

    MATLABを研究に利用している学生です。 N個のデータについて、Nx2の行列にそれぞれの二次元座標が格納されています。 この時、全ての点を描画しつつ、 特定のデータの間

  • 解決済

    matlabでの計算について

    matlabで計算をしたいのですが、使い方がいまいちわかっておりません 計算というのは例えば 13 1 15 7 ≈ 58 576 のように1行614400列の行

  • 解決済

    matlabでのfor文を使った行列の結合

    題名にもある通りfor文を使って行列の結合をしたいと考えています。 k1=(1,2,3);k2=(4,5,6);k3=(7,8,9);k4=(10,11,12);このようにkが9

  • 解決済

    MATLAB ファイル読み込み

    観測したzipファイルを手で解凍し、MATLABで読み込む方法についてです。 観測で得られたzipファイルを手動で解凍し、開くと ーーーーーーーーーー e16A0319.

  • 解決済

    Matlabでのtxtファイル出力について

    前提・実現したいこと iが1から21までループさせ、その結果を1つのテキストファイル(ファイル.txt)に縦に出力させたいです。 ↓fa↓ SizeX0 = 0; Si

  • 解決済

    Matlabで時間スケール変換を用いて音声の尺を長くするコード

    前提・実現したいこと Matlabで時間スケール変換を用いて、音質は損なわずに音声データの尺を2倍長くしようとしています。実現できているのは、尺はそのままで音の高さを変えることです

  • 解決済

    matlabでの連続処理

    前提・実現したいこと カレントディレクトリのcsvを読み込んで解析結果を同じディレクトリに吐き出すプログラムを使用しています。 恥ずかしながら手動でディレクトリを移動させて毎度毎度

  • 解決済

    MATLABでのsaveasを用いた画像保存

    この質問から引き続きになります saveasを用いて画像を保存しようとし、 saveas(gcf,'保存したいフォルダの絶対パス\REC_AREA.bmp') と書いたと

同じタグがついた質問を見る

  • C

    3201questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3014questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • アルゴリズム

    355questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

  • 関数

    187questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

  • MATLAB

    125questions

    MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。