여기이 코드에서 나는 wav 파일에 stft를하고있다. 그 문제는 없습니다. 처음에는 매개 변수를 정의하고 나중에 wav 파일을 사용하여 stft를 적용했습니다. 기본적으로 내가하고있는 것은 실시간 스펙트럼 분석입니다. 어쨌든 내 질문은, 어떻게 주파수 대역을합니까? 신호를 LOW/MEDIUM/HIGH로 구분하고 싶습니다. 내 벡터를 저역에서 0-250 Hz, 중간 대역에서 250-5000 Hz, 고 대역에서 5-22.05 kHz에서 저장해야합니다. Matlab에서 코드를 이해하도록하지 않으면 조언을드립니다. 그냥 wav 파일을 가져 가라. Btw 내 신호는 "Yres"변수에 표시됩니다. 어떤 해결책을 부탁드립니다!주파수 대역을 수행하는 방법은 무엇입니까?
NFA=2; % Number is used for plotting every 2nd picture
t_seg=0.05; % Length of segment in ms
fftlen = 4096;
% Lenght of "fft",because our segment contains 2205 points
[y,fs]=audioread('UnchainMyHeart.wav');
% audioread = functions reads WAV-file
% y = A vector which contains my audio signal
% fs = sample frequency (44100)
% 'UnchainMyHeart' = WAV-file
t=linspace(0,length(y)/fs,length(y));
% linspace = Creating time vector
% 0 = Start time
% length(y)/fs = End time
% length(y) = Number of samples in y
plot(t,y)
% plotting signal in the time domain
segl =floor(t_seg*fs);
% Applying fft function on the variable "segl"
windowshift=segl/2;
% Defining the size of the window, which goes to the next "segl"
window=hann(segl);
% hann function
window=window.';
si=1;
%Start index
ei=segl;
%End index
AOS= length(y)/windowshift - 1;
% AOS is the number of "segl" we use (About 433)
f1=figure;
% Opening new window
f=0:1:fftlen-1;
f=f/(fftlen-1)*fs;
% Defining frequency vector
Ya=zeros(1,fftlen);
plot(f,Ya),axis([0 fs -90 50])
grid on
n=0;
%start variable
for m= 1:1:AOS
y_a = y(si:ei);
y_a= y_a.*window;
Ya=fft(y_a, fftlen);
n=n+1;
if n==1
Yres=abs(Ya);
else
Yres=Yres+abs(Ya);
end
if n==NFA
Yres=Yres/NFA;
n=0;
drawnow;
%Tut die Grafikobjekte immer auf den neuesten Stand updaten
figure(f1);
plot(f(1:end/2), 20*log10(abs(Yres(1:end/2))));
ylim([-90 50]);
title('Spektrum eines Audiosignal');
xlabel('f(Hz)');
ylabel('dB');
grid on;
end
si=si+windowshift;
% Updating start index
ei=ei+windowshift;
% Updating end index
end
내 fs는 44.1k입니다. 나는 당신이 무슨 뜻인지 이해한다고 생각합니다. (영어는 제 모국어가 아닙니다). 나는 이미 stft를위한 함수가 내장되어 있다는 것을 알고있다. 그러나 나는 이것이 프로젝트를위한 것이라고 말하고 필자는 빌트인 함수를 사용하지 않고 직접 코드를 작성해야한다고 언급해야한다. 당신이 나를 보여 주거나 설명 할 수 있다면 범위를 어떻게 정하는 것이 가능할까요? 나는 조금 문제가있다, 그것을 적용하는 방법. –
이것은 주파수 해상도의 일반적인 경우입니다 (fft 및 stft 모두에서 작동 함). fs = 44.1 kHz 인 경우 최대 캡처 주파수는 22050입니다. –
fs = 44.1 kHz 인 경우 캡처 된 최대 주파수는 22050입니다. 4096의 주파수 해상도에서 44.1e3/4096 간격의 주파수를 갖게됩니다 = STFT에서 10.7666 및 2049 값. 따라서 주파수 벡터는 0, 10.7666, 21.5332, 32.2998, ... 22050이됩니다. 당신의 경우, STFT (1:24)는 저 대역, STFT (25 : 465)는 중간 대역, 나머지는 고 대역 용입니다. 네가 그걸 얻길 바란다. STFT는 결과 값을 저장하는 변수입니다. –