Hier in diesem Code stehe ich auf meiner wav-Datei. Es gibt kein Problem damit. Am Anfang definiere ich meinen Parameter, benutze danach meine wav-Datei und verwende dann den Befehl stft. Im Grunde mache ich eine Echtzeit-Spektralanalyse. Wie auch immer, meine Frage ist, wie mache ich eine Frequenzband? Ich möchte, dass mein Signal in LOW/MEDIUM/HIGH getrennt wird. Ich möchte, dass mein Vektor gespeichert wird, von 0-250 Hz im LOW-Band, 250-5000 Hz im MEDIUM-Band, 5-22,05 kHz im HIGH-Band. Ich rate dir, meinen Code in Matlab auszuprobieren, wenn du es nicht verstehst. Nimm einfach irgendeine wav-Datei. Übrigens ist mein Signal in der Variablen "Yres" aufgetragen. Jede Lösung wird geschätzt!Wie mache ich ein Frequenzband?
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
Meine fs ist 44.1k.Ich denke ich verstehe, was du meinst. (Englisch ist nicht meine Muttersprache). Ich bin mir bewusst, dass es bereits eine eingebaute Funktion für das STFT gibt. Aber ich hätte erwähnen sollen, dass dies für ein Projekt ist und ich bin verpflichtet, den Code selbst zu machen, ohne die eingebaute Funktion zu benutzen. Ist es vielleicht möglich, wenn Sie mir zeigen/erklären, wie Sie den Bereich angeben? Ich bin ein bisschen beunruhigt, wie man es anwendet. –
Dies ist ein häufiger Fall der Frequenzauflösung (funktioniert sowohl für fft als auch für ftft). Wenn Sie fs = 44,1 kHz haben, wird Ihre maximale Frequenz 22050 sein. –
Wenn Sie fs = 44,1 kHz haben, wird die maximal erfasste Frequenz 22050 sein. Bei einer Frequenzauflösung von 4096 haben Sie Frequenzen von 44,1e3/4096 = 10.7666 & 2049 Werte in STFT. Der Frequenzvektor lautet also: 0, 10.7666, 21.5332, 32.2998, ... 22050. In deinem Fall wird STFT (1:24) für Low-Band, STFT (25: 465) für Med-Band, der Rest ist für High-Band. Ich hoffe du verstehst es. STFT ist die Variable, in der Sie Ihren Ergebniswert speichern. –