오디오 스트림이 주어지면 문이 닫힐 때를 찾습니다(음압 레벨 계산?)

StackOverflow https://stackoverflow.com/questions/499795

문제

박수 감지기와 다르지 않습니다("박수 쳐! 박수 박수 박수쳐! 박수 박수 박수쳐라, 박수쳐라, 클래퍼! 박수 박수 ") 문이 닫히는 시기를 감지해야 합니다.이것은 방이나 집 문보다 더 쉬운 차량 안에 있습니다.

듣다: http://ubasics.com/so/van_driver_door_closing.wav

바라보다:
image of waveform shows steady line, then sudden disruption, settling down to steady line

16비트 4khz로 샘플링하고 있는데, 샘플 처리나 저장을 많이 피하고 싶습니다.

대담함이나 다른 파형 도구로 보면 매우 독특하며 차량의 음압 증가로 인해 거의 항상 클립이 발생합니다. 심지어 창문과 다른 문이 열려 있는 경우에도 마찬가지입니다.

듣다: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav

바라보다:
alt text

나는 4kHz, 8비트에서 판독값을 취하고 '정상 상태'를 추적하는 비교적 간단한 알고리즘이 있을 것으로 기대합니다.알고리즘이 사운드 레벨의 상당한 증가를 감지하면 해당 지점을 표시합니다.

  • 당신의 생각은 무엇입니까?
  • 이 이벤트를 어떻게 감지합니까?
  • 도움이 될 수 있는 음압 레벨 계산의 코드 예제가 있습니까?
  • 덜 빈번한 샘플링(1kHz 또는 그보다 느린?)으로 벗어날 수 있습니까?

업데이트: Octave를 사용하여(오픈 소스 수치 분석 - Matlab과 유사) 제곱 평균이 나에게 필요한 것을 제공하는지 확인합니다(이 결과는 SPL과 매우 유사합니다).

업데이트2: RMS를 계산하면 간단한 경우에 문이 쉽게 닫히는 것을 발견합니다.
alt text alt text
이제 어려운 경우(무선 켜기, 열/공기 켜기 등)만 살펴보겠습니다.CFAR은 정말 흥미로워 보입니다. 적응형 알고리즘을 사용해야 한다는 것을 알고 있으며 CFAR이 확실히 적합합니다.

-아담

도움이 되었습니까?

해결책

소스 오디오 파일의 스크린샷을 보면 사운드 레벨의 변화를 감지하는 간단한 방법 중 하나는 다음을 수행하는 것입니다. 수치 적분 특정 시간에 파동의 "에너지"를 알아내기 위해 샘플을 수집합니다.

대략적인 알고리즘은 다음과 같습니다.

  1. 샘플을 여러 섹션으로 나눕니다.
  2. 각 구간의 에너지 계산
  3. 이전 창과 현재 창 사이의 에너지 비율을 구합니다.
  4. 비율이 일부 임계값을 초과하는 경우 갑자기 큰 소음이 발생했는지 확인합니다.

의사코드

samples = load_audio_samples()     // Array containing audio samples
WINDOW_SIZE = 1000                 // Sample window of 1000 samples (example)

for (i = 0; i < samples.length; i += WINDOW_SIZE):
    // Perform a numerical integration of the current window using simple
    // addition of current sample to a sum.
    for (j = 0; j < WINDOW_SIZE; j++):
        energy += samples[i+j]

    // Take ratio of energies of last window and current window, and see
    // if there is a big difference in the energies. If so, there is a
    // sudden loud noise.
    if (energy / last_energy > THRESHOLD):
        sudden_sound_detected()

    last_energy = energy
    energy = 0;

나는 이것을 시도하지 않았다는 면책 조항을 추가해야합니다.

이 방법은 먼저 샘플을 모두 녹음하지 않고도 수행할 수 있어야 합니다.일정 길이의 버퍼가 있는 한(WINDOW_SIZE 예) 수치 적분을 수행하여 소리 섹션의 에너지를 계산할 수 있습니다.그러나 이는 처리 기간에 따라 처리가 지연될 수 있음을 의미합니다. WINDOW_SIZE.사운드 섹션의 적절한 길이를 결정하는 것도 또 다른 관심사입니다.

섹션으로 분할하는 방법

첫 번째 오디오 파일에서는 문이 닫히는 소리의 지속 시간이 0.25초인 것으로 나타나므로 수치 적분에 사용되는 창은 아마도 그 절반, 또는 훨씬 더 10분의 1 정도여야 합니다. 무음 구간과 소음 구간 사이에 창이 겹쳐도 조용함과 갑작스러운 소리가 감지될 수 있습니다.

예를 들어 통합 윈도우가 0.5초이고 첫 번째 윈도우가 0.25초의 침묵과 0.25초의 문 닫힘을 덮고 있었고 두 번째 윈도우가 0.25초의 문 닫힘과 0.25초의 침묵을 덮고 있었다면 다음과 같이 나타날 수 있습니다. 두 사운드 섹션의 소음 수준은 동일하므로 사운드 감지가 실행되지 않습니다.짧은 창을 사용하면 이 문제가 다소 완화될 것이라고 생각합니다.

그러나 창이 너무 짧으면 소리의 상승이 하나의 창에 완전히 들어 가지 않을 수 있으며 인접한 섹션 간의 에너지 차이가 ​​거의 없어 소리가 누락되는 것처럼 보일 수 있습니다.

나는 믿는다 WINDOW_SIZE 그리고 THRESHOLD 둘 다 감지될 소리에 대해 경험적으로 결정되어야 합니다.

이 알고리즘이 메모리에 보관해야 하는 샘플 수를 결정하기 위해 다음과 같이 해보자. WINDOW_SIZE 문이 닫히는 소리의 1/10로, 약 0.025초입니다.4kHz의 샘플링 속도에서는 100개의 샘플이 됩니다.메모리 요구 사항이 그리 많지 않은 것 같습니다.200바이트인 16비트 샘플을 사용합니다.

장점 단점

이 방법의 장점은 소스 오디오가 정수로 입력되는 경우 간단한 정수 연산으로 처리를 수행할 수 있다는 것입니다.문제는 이미 언급했듯이 통합되는 섹션의 크기에 따라 실시간 처리가 지연된다는 것입니다.

이 접근 방식에는 몇 가지 문제가 있다고 생각됩니다.

  1. 배경 소음이 너무 크면 배경 소음과 문 닫힘 사이의 에너지 차이가 ​​쉽게 구별되지 않아 문 닫힘을 감지하지 못할 수도 있습니다.
  2. 박수소리와 같은 갑작스러운 소음은 문이 닫히는 것으로 간주될 수 있습니다.

아마도 푸리에 분석을 사용하여 문 닫힘의 주파수 특성을 분석하는 것과 같은 다른 답변의 제안을 결합하면 더 많은 처리가 필요하지만 오류가 발생할 가능성이 줄어듭니다.

이 문제를 해결하는 방법을 찾기 전에 아마도 몇 가지 실험이 필요할 것입니다.

다른 팁

자동차의 문 닫힘 스위치를 두드려야 합니다.사운드 분석을 통해 이를 수행하려는 것은 과도한 엔지니어링입니다.

다양한 신호 처리 접근법에 대한 많은 제안이 있지만 실제로 탐지 이론에 대해 배우고, 내장 된 신호 처리 보드를 구축하고, 선택한 칩의 처리 아키텍처를 배우고, 알고리즘을 시도하고, 디버그하고, 디버그하고, 디버그하십시오. 그런 다음 사용하려는 차에 맞게 조정하십시오 (그리고 다른 모든 차에 다시 적용하고 다시 살짝 바르고 있습니다), Stickey가 차 안에 리드 스위치를 테이프로 테이프하고 자석을 문.

dsp 전문가에게 흥미로운 문제가 아니라는 것은 아닙니다. 하지만 이 질문을 하는 방식을 보면 그 소리가 분명합니다 처리는 원하는 경로가 아닙니다.그런 악몽이 될 것입니다 제대로 작동하도록 합니다.

또한 클래퍼는 임계값 감지기에 공급되는 고역 통과 필터일 뿐입니다.(두 번의 박수를 동시에 충분히 빠르게 칠 수 있도록 타이머도 추가)

레이더 세계에는 이 문제에 관한 많은 관련 문헌이 있습니다(탐지 이론이라고 함).

"셀 평균 CFAR"(Constant False Alarm Rate) 감지를 살펴볼 수 있습니다.Wikipedia에는 ​​약간의 내용이 있습니다. 여기.귀하의 아이디어는 이것과 매우 유사하며 작동할 것입니다!:)

행운을 빌어요!

스펙트럼을 살펴보는 것부터 시작하겠습니다.나는 당신이 제공한 두 개의 오디오 파일에 대해 이 작업을 수행했는데, 당신이 사용할 수 있는 몇 가지 유사점이 있는 것 같습니다.예를 들어 둘 사이의 주요 차이점은 약 40-50Hz인 것 같습니다.내 .02.

업데이트

이 글을 올리고 나서 또 다른 생각이 들었습니다.가능하다면 장치에 가속도계를 추가하세요.그 다음에 진동 신호와 음향 신호의 상관 관계.이는 교차 차량 도어 감지에 도움이 됩니다.예를 들어 스테레오는 그렇지 않은 반면 사운드는 진동으로 구동되기 때문에 상관관계가 높아야 한다고 생각합니다.앞 유리 마운트(흡입 컵)를 사용하여 엔진 rpm을 감지할 수 있는 장치가 있으므로 감도가 있을 수 있습니다.(나는 이것이 효과가 있다고 약속하지 않습니다!)

alt text
(원천: charlesrcook.com)

%% Test Script (Matlab)
clear
hold all %keep plots open
dt=.001

%% Van driver door
data = wavread('van_driver_door_closing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

%% Repeat for van sliding door
data = wavread('van_driverdoorclosing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

오디오 신호에서 뚜렷한 스파이크를 찾는 프로세스를 과도 감지.다음과 같은 애플리케이션 소니의 애시드 그리고 에이블톤 라이브 비트 매칭을 위해 과도 감지를 사용하여 음악에서 비트를 찾습니다.

위의 파형에서 볼 수 있는 뚜렷한 스파이크를 과도 현상이라고 하며 이를 감지하는 데 사용할 수 있는 몇 가지 좋은 알고리즘이 있습니다.종이 에너지 문제의 과도 감지 및 분류 이를 수행하는 3가지 방법을 설명합니다.

주파수와 진폭도 차량마다 크게 다를 것이라고 생각합니다.이를 결정하는 가장 좋은 방법은 시민 차량과 대형 SUV에서 샘플을 채취하는 것입니다.아마도 진폭과 주파수 신호를 얻기 위해 사용자가 "학습" 모드에서 문을 닫도록 할 수 있습니다.그런 다음 이를 사용하여 사용 모드에 있을 때를 비교할 수 있습니다.

당신은 또한 사용을 고려할 수 있습니다 푸리에 분석 문이 닫힐 때 발생하지 않는 배경 소음을 제거합니다.

어쩌면 문이 닫혔다는 표시가 되는 기압의 즉각적인 상승을 감지해야 할 수도 있습니다.이 파형 및 사운드 레벨 분석과 함께 사용하면 더 나은 결과를 얻을 수 있습니다.

덜 빈번한 샘플링 문제의 경우 캡처할 수 있는 가장 높은 사운드 주파수는 샘플링 속도의 절반입니다.따라서 자동차 문 소리가 1000Hz에서 가장 강한 경우(예를 들어) 2000Hz 미만의 샘플링 속도에서는 해당 소리가 완전히 손실됩니다.

매우 간단한 노이즈 게이트는 아마도 귀하의 상황에서 잘 작동할 것입니다.진폭이 지정된 임계값보다 높은 첫 번째 샘플을 기다리면 됩니다(배경 노이즈로 인한 트리거 방지).다양한 유형의 소음을 구별해야 하는 경우 이보다 더 복잡해지면 됩니다(예:문이 닫히는 것과 손뼉을 치는 것).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top