音声データよりFFTを計算し一部を抜き出し順次保存する方法(ワークスペースor csv)
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
0 개 추천
音声データよりFFTを順次保存することができるようになりましたが、1-44100のデータすべてではなく10001~20000のデータを抜き取りcsvファイルだけではなくワークスペースに一つにまとめて保存する方法をご教授お願いします。(csvファイルをひとつずつ作成するのではなく、FFTの結果(10001~20000)を一つの変数に順次保存するイメージです)
今までのプログラムも添付させていただいてます。
채택된 답변
Atsushi Ueno
2022년 11월 15일
편집: Atsushi Ueno
2022년 11월 15일
1 개 추천
下記の様に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.
Atsushi Ueno
2022년 11월 16일
>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のセルの形を作りたいと考えてます。
質問の仕方も悪く何度も何度も申し訳ございません。ご教授いただけると幸いです。
Hernia Baby
2022년 11월 17일
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
Atsushi Ueno
2022년 11월 17일
このプログラムは必ず同じサイズ(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)