FFT結果を片側スペクトルを行い保存する方法

3 views (last 30 days)
一秀 近藤
一秀 近藤 on 18 Jan 2023
Edited: Hernia Baby on 21 Jan 2023
[x,fs]=audioread("gum70-25.wav");
f = 50:50:500;
Fs = 44100;
dt=1/Fs;
duration=(length(x)-1)*(1/fs);
t = (0:1/Fs:duration)';
n = floor(length(t)/Fs);
w = hamming(Fs);
for ii = 1:n
z{ii} = fft(w.*x(Fs*(ii-1)+1:Fs*ii));
z1{ii}=abs(z{ii})
z2{ii}= z1{ii}(10001:20000,:);
writematrix(z2{ii},sprintf('gum70-25_fftsave_%03d.csv',ii))
end
wavファイルを用いてワークスペースにベクトル化を行い、その後FFTを44100点ずつ行いました。FFTを行った後に振幅スペクトルを計算しその後1ok~20kHzの部分のみを抜き出そうとしたのですが、うまくできませんでした。
簡単なことではありますがご教授おねがいいたします。
  2 Comments
一秀 近藤
一秀 近藤 on 19 Jan 2023
返信ありがとうございます。
バンドパスの部分です。
振幅スペクトルの仕方がまちがっているのかなと考えています。信号の片側振幅スペクトルを計算し、その中の10k-20kのみをデータとして保存したいと考えてます。

Sign in to comment.

Answers (1)

Hernia Baby
Hernia Baby on 21 Jan 2023
Edited: Hernia Baby on 21 Jan 2023
stftを使って振幅の片側スペクトルを求めてます。
今回はサンプリング周波数10,000Hz, 窓の大きさを1,000とします。
clear,clc;
Fs = 10000;
winsize = 1000;
Bandpath = [180 220];
サンプルデータを作ります。
t = (0:1/Fs:3-1/Fs).';
x = 0.5*cos(2*pi*t*200) + 0.1*randn(size(t));
figure
plot(t,x,'Color',[.4 .4 .4])
xlabel('時間[sec')
ylabel('信号')
stftで各パラメタを設定します。
今回窓は箱型にしています。
[s,f,t] = stft(x,Fs,'OverlapLength',0,'FFTLength',winsize,'FrequencyRange','onesided','Window',rectwin(winsize));
ここでバンドパス(というか周波数の範囲を決めただけ)を行います。
振幅については正規化します。
idx = f >= Bandpath(1) & f <= Bandpath(2);
s_b = abs(s(idx,:))./(winsize/2);
f_b = f(idx);
可視化します。
figure
heatmap(t,f_b,s_b)
xlabel('時間[sec]')
ylabel('周波数[Hz]')
colorbar
colormap(jet(10))
clim([0 1])

Categories

Find more on フーリエ解析とフィルター処理 in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!