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

12 次查看(过去 30 天)
Jo Sasaki
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

采纳的回答

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

更多回答(1 个)

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

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!