2016-11-23 1 views
1

여기이 코드에서 나는 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 

답변

1

이것은 최상의 대답이 아닐 수도 있습니다. 그러나 이것은 당신이 무언가를 시작하는 데 도움이 될 수 있습니다. MATLAB의 Signal Processing Toolbox에서 spectrogram() 함수를 사용할 수 있습니다.

하나의 채널이있는 'UnchainMyHeart.wav'라는 오디오 파일이 있다고 가정 해 보겠습니다. 다음의 코드 진행 :

% Reading the audio file 
[y1,fs] = audioread('UnchainMyHeart.wav'); 

% Parameters for STFT (or spectrogram) 
windowDuration = 30e-3; overlapDuration = 15e-3; 
windowLength = round(windowDuration*fs); % window length 
overlapLength = round(overlapDuration*fs); % overlapping of windows 
nfft = 1024; 

% Executing STFT for the signal 
[S1,F1,T1,P1] = spectrogram(x1,hanning(windowLength), ... 
overlapLength, nfft, fs, 'yaxis'); 

는 S1과 P1은 추정 T1에 포함 된 시간 간격을두고 각 구간의 시간 간격에 대한 신호의 STFT 및 전력 스펙트럼 밀도 (PSD)를 포함한다.

질문 :은 샘플링 빈도 fs로 표시되는 주기적 주파수의 벡터 인 F1을 찾고 있습니다. 예 : 샘플링 주파수가 48 kHz (fs)이고 nfft가 1024 인 경우 (fs/nfft)만큼 간격을 둔 513 [(1024/2) +1]] 개의 주파수 값을 갖게됩니다. 즉 46.875이다. 따라서 주파수 구성 요소는 0, 46.875, 46.875 * 2, ..., 46.875 * 512가됩니다. Nyquist 기준으로 인해 최대치는 24kHz입니다.

이제 범위를 지정하는 간단한 루틴을 쉽게 작성할 수 있습니다. stft 구현 인 코드에서 동일한 기술을 사용할 수 있습니다. 문제가 구현을 요구하지 않는 한, MATLAB의 내장 함수를 사용하는 것이 좋습니다. 희망이 도움이!

STFT에 대한 매개 변수가 코드에 포함 된 이유가 무엇인지에 대해 필자는 대답 할 수 있습니다.

+0

내 fs는 44.1k입니다. 나는 당신이 무슨 뜻인지 이해한다고 생각합니다. (영어는 제 모국어가 아닙니다). 나는 이미 stft를위한 함수가 내장되어 있다는 것을 알고있다. 그러나 나는 이것이 프로젝트를위한 것이라고 말하고 필자는 빌트인 함수를 사용하지 않고 직접 코드를 작성해야한다고 언급해야한다. 당신이 나를 보여 주거나 설명 할 수 있다면 범위를 어떻게 정하는 것이 가능할까요? 나는 조금 문제가있다, 그것을 적용하는 방법. –

+0

이것은 주파수 해상도의 일반적인 경우입니다 (fft 및 stft 모두에서 작동 함). fs = 44.1 kHz 인 경우 최대 캡처 주파수는 22050입니다. –

+0

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는 결과 값을 저장하는 변수입니다. –

관련 문제