MATLAB Answers

0

ある長い信号に対し連​続でfftを行い、連​番で保存する方法

Jo Sasaki さんによって質問されました 2019 年 7 月 2 日
最新アクティビティ Shoumei
さんによって 回答されました 2019 年 7 月 4 日
50khz、60秒の(3,000,001サンプルcsvデータがありまして、このcsvデータに対し2000データずつ且つ1000データずらしでfftを行いたいと考えています。
fftのかける範囲としては最初のfftは1~2001サンプルまでの範囲、次のfftをかける範囲としては1001~3001サンプルまでの範囲、のようにかけていき、結果を"fftcsvtitle_0000001.csv"のように連番で保存したいのですが方法をご教授いただければありがたいです。
fftの窓関数はhamming窓を指定する予定です。
複数長さの違うcsvデータが存在しているので下記のように信号の長さを変えれるようにしたいです。
Fs = 50000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 3000001; % Length of signal
t = (0:L-1)*T; % Time vector

  0 件のコメント

サインイン to comment.

タグ

2 件の回答

Shoumei
回答者: Shoumei
2019 年 7 月 4 日
 採用された回答

Yoshioさん相変わらずスパルタ教育ですね。
サンプルプログラム作成したのでご参考に。
まずテストデータ作成
%% テストデータ作成
dataLength = 3e6+1;
t = [0:dataLength-1]/50e3;
sig = chirp(t, 10, t(end), 20e3)'; % テスト用のチャープ信号
csvwrite('test1.csv', sig)
初期化
clear
FFTするプログラム
%%
Fs = 50e3; % Sampling frequency
Ts = 1/Fs; % Sampling period
sig = csvread('test1.csv'); % test1.csvに3000001点のデータが入っていると仮定
L = length(sig); % L = 30001
t = (0:L-1)*Ts; % Time vector
fftLength = 2000; % FFT点数
bufOverwrap = 1000; % Overwrap点数
winHam = hamming(fftLength); % hamming window
n = 1;
fileNum = 1;
%%
while true
sigFFT = fft(sig(n:n+fftLength-1).*winHam); % 2000点を切り出し。n = 1, 1001, 2001, ....
% 確認用
% subplot(2,1,1)
% plot(sig(n:n+fftLength-1))
% subplot(2,1,2)
% plot(log(abs(sigFFT)))
fileName = ['fftcsvtitle_' num2str(fileNum) '.csv'];
csvwrite(fileName, sigFFT)
fileNum = fileNum + 1;
n = n + bufOverwrap; % データ切り出し用の要素番号をインクリメント
if n > L-fftLength
break % nの値が信号点数を超えるとwhile Loop抜ける
end
end

  0 件のコメント

サインイン to comment.


Yoshio
回答者: Yoshio
2019 年 7 月 3 日

こちらのspectrogramが使えるかと思います。結果の行列の列ごとに連番でcsvファイルにしてみてください。
もしメモリが足りないようでしたら、別の方法を考えましょう。

  0 件のコメント

サインイン to comment.