2016-11-21 2 views
1

스펙트로 그램으로 신호를 처리 한 후 FFT 프레임에서 로컬 최대 값을 추출하려고합니다.matlab을 사용하여 스펙트로 그램으로 처리 한 후 FFT 프레임에서 로컬 최대 값을 추출합니다.

전화 사용자가 약 팔 길이 스마트 폰을 잡고 자신의 모든 폐 볼륨에서 호흡하고, 강제 내쉬고 :

는 특히, 나는 wav 파일에있는 오디오 파일을 가지고 있고 다음 절차에 수집 있다고 말했다 전체 폐 부피가 제거 될 때까지 전화기의 마이크가 호기를 기록하고 데이터를 wav 파일에 저장합니다.

우선, I는 (프레임 간의 50 % 겹침)는 30ms 프레임으로 오디오 버퍼 :

는 그때는 다음 절차 스펙트로와 오디오를 처리한다. 그런 다음 각 프레임을 해밍 창을 사용하여 창에 표시하고 |FFT|db을 취하여 신호의 크기 스펙트로 그램을 생성합니다.

[X, FS] = audioread('Rec_002.wav'); 
info = audioinfo('Rec_002.wav'); 
window = (30*0.001/info.Duration)*info.TotalSamples; 
[s,f,t,ps]=spectrogram(X, window, [], [], FS); 

Rec_002.wav 내 오디오 파일입니다 : 내가 MATLAB을 사용하는 것을 어떻게 여기

이다. 스펙트로 그램으로 신호를 처리 한 후 슬라이딩 윈도우를 통해 계산 된 각 프레임의 로컬 최대 값을 사용하여 공명을 추출합니다. 그런 다음 전역 최대 값의 20 %보다 큰 로컬 최대 값이 저장됩니다. 다음은

은 스펙트로 그램은 위의 데이터를 사용할 때처럼 보이는 방법을 보여줍니다 Spectrogram image

이 정상적으로은 지금까지

After extracting resonaces from spectrogram image

스펙트로

에서 추출 후 모습 공진을 보여줍니다, 나는 출력 중 하나를 사용 인수 s - 단시간 푸리에 변환으로 로컬 최대 값 추출. 내 목표를 달성하기 위해 전력 스펙트럼 밀도 (PSD) -

local_max=max(abs(s)); 
threshold=0.2*max(local_max,[],2); 
local_max=local(:,local_max>threashold); 

질문은 나는 그것이 s을 사용하는 것이 맞습니다 또는 내가 ps를 사용할지 여부를 확실하지 오전입니다 :

여기 내 코드입니다.

누구든지 내게 알려 줄 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

답변

0

스펙트로의 출력 S는 [T1, T2] 사이의 신호 주파수 성분의 진폭이다.

전력 스펙트럼 밀도는 합계 (CT 도메인의 경우 통합)를 통해 주어진 지속 시간 (STFT) 동안 주파수 범위 내에서 전력량을 계산하는 데 사용할 수 있습니다. 이것은 "밀도"라는 이름에서 다소 직관적입니다.

그래서 당신은 PS 대신 의에 임계 논리를 적용 할 경우, 당신은 가장 높은 그라데이션 (로컬) 대신에 최대 (로컬)로 끝날 것입니다.

+0

그래서 'ps'를 사용하면 가장 높은 그래디언트를 추출합니다. 로컬 최대 값을 추출하려면 대신's'을 사용해야합니다. 그런데 스펙트로 그램 처리와 관련하여 로컬 최대 값을 추출하는 것은 특별한 의미가 있습니다.내가 종이에서 읽었 기 때문에 저자가 왜 지역 최대를 추출하려고하는지 이해하려고 노력하고 있습니다. – wqlin

+0

또한, 제 질문을 업데이트 했으므로 자유 시간을 가졌습니까? 감사. – wqlin

+0

단시간 FT 인 스펙트로 그램을 사용하는 이유는 입력 신호가 고정적이 아니므로 주파수 내용이 시간에 따라 변하는 것입니다. 따라서 공진 주파수, 즉 가장 큰 진폭을 가진 주파수를 각 시간 창에서 찾는 데 관심이있는 경우 로컬 최대 S가 필요합니다. –