오디오 스트림이 주어지면 도어가 언제 쾅쾅 닫히는지 확인합니다(음압 레벨 계산?).
박수 감지기와 다르지 않습니다. ("박수 쳐! 박수 쳐! 박수 쳐! 박수 쳐! 박수") 문이 닫힐 때 감지해야 합니다.이것은 객실이나 가정용 도어보다 더 쉬운 차량에 있습니다.
듣기: http://ubasics.com/so/van_driver_door_closing.wav
16비트 4kHz로 샘플링하고 있는데, 샘플의 많은 처리나 보관은 피하고 싶습니다.
대담성이나 다른 파형 도구로 보면 상당히 독특하며, 거의 항상 차량 내 음압 증가로 인해 클립이 발생합니다. 심지어 창문이나 기타 도어가 열려 있을 때도 마찬가지입니다.
듣기: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engineon.wav
4kHz, 8비트로 판독하고 '안정 상태'를 추적하는 비교적 간단한 알고리즘이 있을 것으로 예상합니다.알고리즘이 사운드 레벨의 현저한 증가를 감지하면 그 지점을 표시합니다.
- 당신의 생각은 어떻습니까?
- 이 이벤트를 어떻게 감지하시겠습니까?
- 도움이 될 수 있는 음압 레벨 계산의 코드 예가 있습니까?
- 샘플링 빈도를 줄일 수 있습니까(1kHz 또는 그 이하)?
업데이트: Octave(오픈 소스 수치 분석 - Matlab과 유사)로 플레이하고 루트 평균 제곱이 필요한 것을 제공하는지 확인합니다(SPL과 매우 유사한 결과가 나타남).
업데이트 2:RMS를 계산하면 다음과 같은 간단한 경우 쉽게 문이 닫힙니다.
이제는 어려운 경우(라디오 켜짐, 난방/공기 높낮이 등)만 살펴봐야 합니다.CFAR은 정말 흥미로워 보입니다. 적응형 알고리즘을 사용해야 한다는 것을 알고 있고 CFAR은 확실히 비용이 들어맞습니다.
-아담
소스 오디오 파일의 스크린샷을 보면, 사운드 레벨의 변화를 감지하는 간단한 한 가지 방법은 샘플을 수치적으로 적분하여 특정 시간에 파동의 "에너지"를 알아내는 것입니다.
대략적인 알고리즘은 다음과 같습니다.
- 샘플을 섹션으로 나눕니다.
- 각 구간의 에너지를 계산
- 이전 창과 현재 창 사이의 에너지 비율을 구합니다.
- 비율이 어느 정도 임계값을 초과하는 경우 갑자기 큰 소음이 발생한 것으로 판단합니다.
의사코드
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는 문이 닫히는 소리의 10분의 1이며 약 0.025초입니다.샘플링 속도가 4kHz이면 100개의 샘플이 됩니다.그것은 너무 많은 메모리 요구 사항이 아닌 것 같습니다.16비트 샘플로 200바이트를 사용합니다.
장점/단점
이 방법의 장점은 소스 오디오를 정수로 입력하면 간단한 정수 연산으로 처리를 수행할 수 있다는 것입니다.문제점은 앞서 언급한 바와 같이 실시간 처리는 통합되는 구간의 크기에 따라 지연이 발생한다는 것입니다.
이 접근 방식에 대해 생각할 수 있는 몇 가지 문제가 있습니다.
- 배경 소음이 너무 크면 배경 소음과 도어 닫힘 사이의 에너지 차이를 쉽게 구분하지 못하고 도어 닫힘을 감지하지 못할 수 있습니다.
- 문이 닫히는 것으로 간주할 수 있습니다.
푸리에 분석을 사용하여 문 닫힘의 빈도 서명을 분석하려고 하는 것과 같이 다른 답변의 제안을 결합하면 더 많은 처리가 필요하지만 오류가 발생하기 쉽습니다.
이 문제를 해결하기 위한 방법을 찾기 전에 아마 실험이 필요할 것입니다.
당신은 차 안의 문 닫힘 스위치를 두드려야 합니다.음향 분석을 통해 이를 시도하는 것은 과도한 엔지니어링입니다.
다양한 신호 처리 방법에 대해 여러 가지 제안이 있지만 실제로 탐지 이론을 배울 때까지 내장된 신호 처리 보드를 만들고 선택한 칩의 처리 아키텍처를 배우고 알고리즘을 시도하고 디버깅한 다음 사용할 자동차에 맞게 조정합니다(그리고 다시 조정하고 r).다른 모든 차량에 대해서도 e- debug)를 사용할 수 있습니다. 차 안에 있는 리드 스위치를 테이프로 붙이고 자석을 문에 열접착하기만 하면 좋을 것입니다.
dsp 전문가들이 해결할 흥미로운 문제가 아닌 것은 아니지만, 이 질문을 하는 방식으로 볼 때, 사운드 프로세싱은 여러분이 선택하고 싶은 경로가 아님이 분명합니다.그것을 제대로 작동시키는 것은 단지 악몽이 될 것입니다.
또한 클래퍼는 임계값 검출기에 입력되는 고역 통과 필터일 뿐입니다.(따라서 두 개의 박수를 충분히 빠르게 할 수 있도록 타이머도 준비되어 있습니다.
레이더계에는 이 문제에 대한 관련 문헌이 많이 존재합니다(이것을 탐지 이론이라고 합니다).
"셀 평균 CFAR"(지속적인 거짓 경보율) 탐지를 볼 수 있습니다.위키피디아에는 약간의 정보가 있습니다.당신의 아이디어는 이것과 매우 비슷하고, 효과가 있을 것입니다! :)
행운을 빕니다.
우선 스펙트럼을 보는 것부터 시작하겠습니다.당신이 준 두 개의 오디오 파일에서 이 작업을 했는데, 당신이 사용할 수 있는 유사점이 있는 것 같습니다.예를 들어, 이 둘 사이의 주요 차이는 약 40-50Hz인 것 같습니다.제 .02.
갱신하다
저는 이 글을 올리고 나서 또 다른 생각이 들었습니다.가능한 경우 장치에 가속도계를 추가합니다.그런 다음 진동 신호와 음향 신호를 상관시킵니다.이는 교차 차량 도어 감지에 도움이 될 것입니다.음향은 진동으로 구동되기 때문에, 예를 들어 스테레오는 그렇지 않기 때문에 상관관계가 잘 되어야 한다고 생각합니다.윈드실드 마운트(흡입컵)로 엔진 rpm을 감지할 수 있는 장치를 가지고 있어서 감도가 있을 수 있습니다. (이 장치가 작동한다고 약속하지 않습니다!)
%% 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))
오디오 신호에서 뚜렷한 스파이크를 찾는 과정을 과도 검출이라고 합니다.Sony's Acid와 Ableton Live와 같은 응용 프로그램은 비트 매칭을 위해 음악에서 비트를 찾기 위해 일시적인 감지를 사용합니다.
위의 파형에서 볼 수 있는 뚜렷한 스파이크를 과도라고 하며, 이를 검출하기 위한 몇 가지 좋은 알고리즘이 있습니다.에너지 문제에서 과도 검출 및 분류라는 논문은 이를 수행하기 위한 3가지 방법을 설명합니다.
주파수와 진폭 또한 차량에 따라 크게 다를 것이라고 생각합니다.가장 좋은 판단 방법은 시빅과 대형 SUV의 샘플을 채취하는 것입니다.아마도 사용자가 "학습" 모드로 문을 닫게 하여 진폭 및 주파수 서명을 받을 수 있습니다.그러면 그것을 이용해 사용 모드일 때 비교해 볼 수 있습니다.
또한 푸리에 분석을 사용하여 도어 클로즈와 연관되지 않은 배경 소음을 제거하는 것도 고려할 수 있습니다.
아마도 당신은 문이 닫혔음을 표시해야 할 정도로 즉각적으로 기압이 크게 상승하는 것을 감지해야 할 것입니다.이 파형 및 사운드 레벨 분석과 쌍을 이룰 수 있으며 이 모든 것이 더 나은 결과를 제공할 수 있습니다.
샘플링 빈도가 적을 경우, 캡처할 수 있는 가장 높은 사운드 주파수는 샘플링 속도의 절반입니다.따라서 차량 도어 소리가 1000Hz(예:)에서 가장 강할 경우 2000Hz 미만의 샘플링 속도는 해당 소리를 완전히 잃게 됩니다.
아주 간단한 소음 게이트가 당신의 상황에서는 아마도 잘 될 것입니다.진폭이 지정된 임계값 이상인 첫 번째 샘플을 기다리기만 하면 됩니다(배경 노이즈로 트리거하지 않도록).다른 유형의 소음(예: 문 닫힘 대 손뼉)을 구별해야 하는 경우에는 이보다 더 복잡해질 필요가 있습니다.
언급URL : https://stackoverflow.com/questions/499795/given-an-audio-stream-find-when-a-door-slams-sound-pressure-level-calculation
'programing' 카테고리의 다른 글
| Oracle: tablea, tableb에서 *를 선택합니다. 여기서 a.fielda (+)=b.fieldb -- (+)란 무엇입니까? (0) | 2023.10.14 |
|---|---|
| gcc는 왜 오랫동안 경고를 가지고 있습니까? (0) | 2023.10.14 |
| @viewChild가 작동하지 않음 - property nativeElement of undefined를 읽을 수 없습니다. (0) | 2023.10.14 |
| Eslint angular and jasmine: 정의되지 않음 - undefect (0) | 2023.10.14 |
| Gravity Forms 계산에서 지수 사용 (0) | 2023.10.14 |
