音声データよりFFTを計算し一部を抜き出し順次保存する方法(ワークスペースor csv)
显示 更早的评论
音声データよりFFTを順次保存することができるようになりましたが、1-44100のデータすべてではなく10001~20000のデータを抜き取りcsvファイルだけではなくワークスペースに一つにまとめて保存する方法をご教授お願いします。(csvファイルをひとつずつ作成するのではなく、FFTの結果(10001~20000)を一つの変数に順次保存するイメージです)
今までのプログラムも添付させていただいてます。
采纳的回答
Atsushi Ueno
2022-11-15
编辑:Atsushi Ueno
2022-11-15
下記の様にyを一つの変数ではなくセル配列にすれば、ワークスペースに一つにまとめて保存する事が出来ます。
for ii = 1:n
% y = fft(w.*x(Fs*(ii-1)+1:Fs*ii));
y{ii} = fft(w.*x(Fs*(ii-1)+1:Fs*ii)); % yをセル配列にする
writematrix(y{ii},sprintf('fftsave_%03d.csv',ii))
end
8 个评论
一秀 近藤
2022-11-16
ご回答ありがとうございます。
わかりやすく参考になりました。ちなみにですがyのデータの10001~20000行のみを抽出し、保存するには、どのように行えばよろしいですか?簡単な質問で申し訳ございません。ご教授お願いいたします。
一秀 近藤
2022-11-16

また、このような状態になり実行できませんでした。説明のほどいただけるとありがたいです。
Atsushi Ueno
2022-11-16
编辑:Atsushi Ueno
2022-11-16
添付ファイル fftsave_1115.mlx の冒頭で使用した変数 y (整数型の行列) が残っていて、コードの後半で y を異なる目的でしかもセル配列としてアクセスしようとした為に発生しているエラーです。
%音声出力
[y,Fs] = audioread('10k-20k-10kloop.wav'); % ここで変数 y が誕生
player = audioplayer(y,Fs); % y はこれ以降のコードで使用されない(はずだった)
play(player);
... % 省略
for ii = 1:n
% y = fft(w.*x(Fs*(ii-1)+1:Fs*ii));
y{ii} = fft(w.*x(Fs*(ii-1)+1:Fs*ii));
% ここで y を異なる用途に、しかも行列ではなくセル配列としてアクセス⇒エラー
writematrix(y{ii},sprintf('fftsave_%03d.csv',ii))
end
% 当該エラーの再現
NotCell = [1 2 3; 4 5 6; 7 8 9]; % NotCellはセル配列ではなく行列
NotCell(2,3) % 普通の括弧なら添え字やインデックスでアクセス出来る
ans = 6
NotCell{2,3} % セル配列にアクセスする為の中括弧で行列にアクセスするとエラー
Brace indexing is not supported for variables of this type.
>yのデータの10001~20000行のみを抽出し、保存するには、どのように行えばよろしいですか?
出力のy{1}は10001~20000行
出力のy{2}は10001~20000行
出力のy{3}は20001~30000行...
となるので、セル配列yの2番目、y{2}を保存すれば良いです。
wavファイルに記録されたサンプルレートとは異なるレートで区切る意図ですよね?
writematrix(y{2},sprintf('fftsave_%03d.csv',ii))
一秀 近藤
2022-11-17
返信が遅くなりました。
まず一つ目の質問についての解答ありがとうございます。すごく丁寧に教えていただきわかりやすかったです。早速実行してみたのですが、

このように一つ一つのセルとなってしまうのですが、
①1×23のセルではなく44100×23の形で残せるようにしたいです。
②またこの中の44100ではなく10001~20000だけを抽出し10000×23のセルの形を作りたいと考えてます。
質問の仕方も悪く何度も何度も申し訳ございません。ご教授いただけると幸いです。
for ii = 1:23
C{ii} = rand(1e3,1);
end
size(C)
ans = 1×2
1 23
C1 = cell2mat(C);
size(C1)
ans = 1×2
1000 23
②については以下のように抽出すればいいです
C2 = C1(1:500,:); % 今回は500行分
size(C2)
ans = 1×2
500 23
このプログラムは必ず同じサイズ(44100)のベクトルが積み重なっていくので、セル配列にする必要は無かったですね。もちろんセル配列にしても良いですし、セル配列にした後から行列に変換する事も可能です。
①1×23のセルではなく44100×23の形で残せるようにしたいです。
②またこの中の44100ではなく10001~20000だけを抽出し10000×23のセルの形を作りたいと考えてます。
n = 23; Fs = 44100;
w = hamming(Fs);
x = rand(Fs*n,1); % サンプルデータ
for ii = 1:n
% y = fft(w.*x(Fs*(ii-1)+1:Fs*ii));
y(:,ii) = fft(w.*x(Fs*(ii-1)+1:Fs*ii)); % 44100行のベクトルを23列積み重ねる
writematrix(y(:,ii),sprintf('fftsave_%03d.csv',ii))
end
size(y)
ans = 1×2
44100 23
z = y(10001:20000,:); % 10001~20000行の全列を抽出
size(z)
ans = 1×2
10000 23
すいません。MATLAB Answersで回答を続けているとどうしても保守的というか、どんな入力パターンが来ても良い様な「柔軟な方法」を選ぶ癖が付いてしまってます。でもそれは言い訳で、プログラムをよく読んで行列にすべきかセル配列にすべきかを判断する必要がありますね。
一秀 近藤
2022-11-21
ご丁寧な回答ありがとうございます。ならびに返信が遅れてしまい申し訳ございません。
とてもわかりやすく参考になりました!また自分の知識不足で混乱させてしまいすいません!
また何卒宜しくお願い致します!
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Bartlett 的更多信息
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)