Используйте литерал regex [MDN] :
var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
Вы делаете две ошибки, когда используете RegExp
[MDN] :
/
не должны быть частью выражения Кроме того, модификаторы передаются как второй аргумент функции.
Итак, если вы хотите использовать RegExp
(который вы не используете в этом случае), эквивалент был бы следующим:
var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g");
(и теперь я понял, почему регулярные выражения являются более удобными)
Я всегда нахожу его полезно скопировать и пропустить выражение RegExp
в консоли и посмотреть его вывод. Принимая ваше исходное выражение, получаем:
/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g
, что означает, что выражения пытаются сопоставить /
, s
и g
буквально, а parens ()
по-прежнему рассматриваются как специальные символы .
Обновление: .match()
возвращает массив:
["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]
, который, кажется, не очень полезен.
Вы должны использовать .exec()
[MDN] для извлечения чисел:
["(25.774252, -80.190262)", "25.774252", "-80.190262"]
Это нужно вызывать до тех пор, пока все строки не будут обрабатывается.
Пример:
var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
var result, points = [];
while((result = reg.exec(polygons)) !== null) {
points.push([+result[1], +result[2]]);
}
Это создает массив массивов, а унарный плюс (+
) преобразует строки в числа:
[
[25.774252, -80.190262],
[18.466465, -66.118292],
...
]
Конечно, если вы хотите, чтобы значения как строки, а не как числа, вы можете просто опустить +
.
Смотря на снимки экрана исходных звуковых файлов, один простой способ обнаружить изменение на уровне звука состоял бы в том, чтобы сделать численное интегрирование из образцов для обнаружения "энергии" волны в определенное время.
А грубый алгоритм был бы:
Псевдокод
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 секунды, таким образом, окно, используемое для численного интегрирования, должно, вероятно, быть самое большее половиной из этого или еще большим количеством likeгЂЂa десятой части, таким образом, различие между тишиной и внезапным звуком может быть замечено, даже если окно накладывается между тихим разделом и шумовым разделом.
, Например, если окно интеграции составляло 0,5 секунды, и первое окно покрывало 0,25 секунды тишины и 0,25 секунды дверного закрытия, и второе окно покрывало 0,25 секунды дверного закрытия и 0,25 секунды тишины, может казаться, что два раздела звука имеют тот же уровень шума, поэтому, не инициировав звуковое обнаружение. Я предполагаю иметь короткое окно, облегчил бы эту проблему несколько.
Однако наличие окна, которое слишком коротко, будет означать, что повышение звука не может полностью вписаться в одно окно, и может казаться, что существует мало различия в энергии между смежными разделами, которые могут заставить звук быть пропущенным.
я верю WINDOW_SIZE
, и THRESHOLD
оба оказываются перед необходимостью быть определенным опытным путем для звука, который будет обнаруженным.
Ради определения, сколько образцов, которые этот алгоритм должен будет сохранить в памяти, скажем, эти WINDOW_SIZE
, является 1/10 звука дверного закрытия, которое составляет приблизительно 0,025 секунды. На частоте дискретизации 4 кГц, которая является 100 образцами. Это, кажется, не слишком много требования к памяти. Используя 16-разрядные образцы это составляет 200 байтов.
Преимущества / Недостатки
преимущество этого метода состоит в том, что обработка может быть выполнена с простой целочисленной арифметикой, если исходное аудио подается как целые числа. Выгода уже, как упомянуто, та обработка в режиме реального времени будет иметь задержку, в зависимости от размера раздела, который интегрируется.
существует несколько проблем, о которых я могу думать к этому подходу:
, Возможно, комбинируя предложения в других ответах, таких как попытка проанализировать подпись частоты дверного закрытия с помощью анализа Фурье, который потребовал бы большего количества обработки, но сделает ее менее подверженной ошибке.
Это, вероятно, собирается взять некоторое экспериментирование прежде, чем найти способ решить эту проблему.
Необходимо коснуться в к двери близко переключатели в автомобиле. При попытке сделать это со звуковым анализом - сверхразработка.
существует много предложений о различных подходах обработки сигналов для взятия, но действительно, к тому времени, когда Вы узнаете о теории обнаружения, создают встроенную плату обработки сигналов, изучают архитектуру обработки для микросхемы, которую Вы выбрали, делайте попытку алгоритма, отладьте его и затем настройте его для автомобиля, на котором Вы хотите использовать его (и затем повторно настроиться и повторно отладить его для любого автомобиля), Вам будут жаль, что Вы просто stickey не записали на ленту язычкового переключателя в автомобиле и hotglued магнит к двери.
Не то, чтобы это не интересная проблема для решения для dsp экспертов, но от способа, которым Вы задаете этот вопрос, ясно, что звуковая обработка не является маршрутом, которым Вы хотите следовать. Это просто будет такой кошмар, чтобы заставить его работать правильно.
кроме того, трещотка является просто фильтром высоких частот, питаемым в пороговый детектор. (плюс таймер для проверки 2 хлопков достаточно быстро вместе)
Я запустил бы путем рассмотрения спектрального. Я сделал это на этих двух звуковых файлах, которые Вы дали и там, кажется, некоторое подобие, которое Вы могли использовать. Например, основное различие между этими двумя, кажется, вокруг 40-50Hz. Мои.02.
ОБНОВЛЕНИЕ
у меня была другая идея после регистрации этого. Если Вы можете, добавить акселерометр на устройство. Затем коррелируют вибрационные и акустические сигналы . Это должно помочь с перекрестным дверным обнаружением механизма. Я думаю, что это должно хорошо коррелироваться, так как звук vibrationally управляется, где стерео, например, не. У меня было устройство, которое смогло обнаружить моего об/мин механизма с лобовым стеклом, монтируются (присоска), таким образом, чувствительность могла бы быть там. (Я не делаю обещаний, это работает!)
(источник: 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))
Процесс для нахождения отличного скачка в звуковых сигналах называют переходное обнаружение . Приложения как кислота Sony и Ableton, Живой переходное обнаружение использования для нахождения ударов в музыке для того, чтобы сделать соответствие удара.
отличный скачок Вы видите в форме сигнала выше, назван переходным процессом, и существует несколько хороших алгоритмов для обнаружения его. Бумага Переходное обнаружение и классификация в энергетических вопросах описывает 3 метода для того, чтобы сделать это.
Существует большая соответствующая литература по этой проблеме в радарном мире (она назвала теорию обнаружения).
Вы могли бы взглянуть на "ячейку, составляющую в среднем CFAR" (постоянный уровень ложной тревоги) обнаружение. Википедия имеет немного здесь . Ваша идея очень похожа на это, и она должна работать! :)
Удачи!
environment.plist
во-первых (следовательно эскалация к старшему advisor' s супервизор). Однако упомянутая выше документация разработчика датирована 2009, и последняя версия XCode, кажется, не включает Редактора Списка свойств приложение больше (хотя я действительно находил тот в своей старой папке инструментов разработчика). Если it' s работающий над Вашей системой, можно ли сказать мне, что полномочия находятся на ней? Мои -rw-r--r--@
, и файл принадлежит моему пользователю и группе (как в, группа, имя которой является моим именем пользователя),
– sworisbreathing
25 October 2011 в 03:20
Я предположил бы, что частота и амплитуда будут также значительно варьироваться с механизма на механизм. Лучший способ определить это взял бы образец в Гражданском по сравнению с большим внедорожником. Возможно, Вы могли сделать, чтобы пользователь закрыл дверь в режиме "изучения" для получения подписи амплитуды и частоты. Затем Вы могли использовать это для сравнения когда в режиме использования.
Вы могли также рассмотреть использование анализ Фурье для устранения фоновых шумов, которые не связаны с дверью близко.
Возможно, необходимо попытаться обнаружить значительное мгновенное повышение давления воздуха, которое должно отметить дверь близко. Можно соединить его с этим анализом формы сигнала и уровня звука, и они все могли бы дать Вам лучший результат.
По вопросу о менее частой выборке самая высокая звуковая частота, которая может быть получена, является половиной частоты дискретизации. Таким образом, если бы автомобильный дверной звук был самым сильным на уровне 1000 Гц (например), затем, то частота дискретизации ниже 2000 Гц потеряла бы тот звук полностью
Очень простой подавитель шума, вероятно, сделал бы очень хорошо в Вашей ситуации. Просто ожидайте первого образца, амплитуда которого выше указанного порогового значения (чтобы не инициировать с фоновым шумом). Необходимо было бы только стать более сложными, чем это, если необходимо различать различные типы шума (например, дверь, закрывающаяся по сравнению с ручным хлопком).