ある長い信号に対し連続でfftを行い、連番で保存する方法
12 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
採用された回答
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 件のコメント
その他の回答 (1 件)
参考
カテゴリ
Help Center および File Exchange で スペクトル測定 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!