|
Модераторы: Alexeis |
|
Nikolaiko |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 25.5.2007 Репутация: нет Всего: нет |
Здравствуйте.
Мне нужно написать фильтр частот звукового сигнала. Подробнее: На вход компьютера будет подоваться звук в реальном времени. Например несложная мелодия с гитары. На одной струне. Нужно написать программу: 1. В которой можно задать диапазон частот которые нужно отсечь. Или наоборот задать те которые пропускать. 2. Эта программа будет принимать подающийся звук и воспроизводить его отсекая указанные частоты. 3. Возможно если опция выбрана, то получающийся в результате отсчения звук - записывать. В файл. Вопросы: 1. Какой язык выбрать? 2. Какие функции использовать для этого? 3. Есть ли примеры (исходники) таких или похожих программ? Я писал на С,С++,С# и Pascal (Object Pascal). Но я никогда не работал со звуком, тем более с его записью или фильрацией. |
|||
|
||||
black_priest |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 63 Регистрация: 19.3.2007 Где: Minsk Репутация: нет Всего: нет |
Я для таких целей использовал бы (и использую) функции из Waveform Audio API (Mmsystem.h). С их помощью получаешь буфер, заполненный твоими оцифрованными звуковыми данными. А дальше цифровая обработка сигналов. Тут вариантов много, КИХ, БИХ фильтры, преобразования Фурье. Вобщем, тема на самом деле непростая, но осилить можно.
|
|||
|
||||
nedumat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 7.10.2007 Репутация: нет Всего: нет |
язык С решение тут одно получить частотный спектор для этого - лучше БПФ(быстрое преобразование Фурье). получили частотный спектр че надо убили, че не надо усилили (типа эквалайзер), затем ОБПФ и все конец сообщения и теме. |
|||
|
||||
bilbobagginz |
|
|||
Naughtius Maximus Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 1 Всего: 317 |
Nikolaiko, для начинающего дспишника (от DSP = ЦОС = цифровая обработка сигнала) есть очень удобный DirectSound. часть DirectX.
это один из наиболее эффективных на сегодня методов работы со звуком. Для скорости желательно использовать C или C++. посмотри какие готовые фильтры есть там. есть форумы посвященные этой теме, там есть много материала и примеров. задача довольно типовая. вот это ссылка на MSDN: http://msdn.microsoft.com/en-us/library/bb219818(VS.85).aspx вот это ссылка на форум "KVR audio" на этом форуме есть огромная база добавок для разных музыкальных программ. Часть этих добавок поставляется не только в бинарной форме, но и с исходниками. Среди них есть разные типы, один из которых имеет модуль фильтра. Выбери список DirectX добавок, выбери из них несколько таких, исходник которых доступен, посмотри, чтобы отзывы пользователей были хорошими, скачай, и изучай на здоровье. Это сообщение отредактировал(а) bilbobagginz - 15.4.2009, 10:36 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
feanor59 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 24.1.2008 Где: Пермь Репутация: нет Всего: нет |
дабы не постить темы.
пишу фильтр. есть рабочий модуль бпф (кули-тьюки) с бинарными инверсиями, в общем как положено. преобразование в спектр и обратно работает как надо. но есть проблема с непосредственной фильтрацией. сейчас алгоритм таков: из файла читается прямоугольное окно длины, к примеру, 4096. бинарно инвертируется. подаётся на вход бпф и на выходе получается спектр с 4096 характеристиками. как я понял, из них значимыми являются только первые 2048, а вторая половина - зеркально повторяет 1ю и не несёт доп. инфы. поэтому, пробегая от 0 до 2047, я зануляю те, чья частота удовлетворяет условию. +зануляется соответствующая характеристика во 2й половине (прибавляя 2048, получаю номер элемента из 2й половины). частота текущего элемента вычисляется как Fs/i, где Fs - частота дискретизации аудио (44100), а i номер текущего элемента. далее отредактированный вектор данных опять бинарно инвертируется и подаётся на вход бпф (комплексно сопряжённому). выходные данные записываю в файл. в итоге кроме, порой, серьёзных помех, спектральный анализ не показывает уменьшения уровня фильтруемых частот. мб может кто подсказать, где косяк? |
|||
|
||||
seatouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.11.2008 Репутация: нет Всего: нет |
Уважаемые программисты, добрый день!
Начал заниматься пианино и обнаружил, что нот многих великолепных аранжировок невозможно найти. Созрела амбициозная задача. Написать программу которая будет делить звуковой поток (например wav файл) на множество коротких кусочков (например каждый длительностью 10 мс) и каждый этот кусочек пропускать через 108 фильтров. Каждый фильтр будет выделять одну ноту (Для информации здесь частоты нот http://vlastelingolosa.ru/news_9.html). Фильтр будет выделять не точную частоту, а диапазон в который входит нужная нота, и смотреть, что бы уровень сигнала был выше заданного. В результате такой фильтрации можно получить файл содержащий инф. о том, в какое время сколько и каких нот звучат. Из него, не сложно будет понять, когда пианист нажимает ту или иную ноту (или аккорд). Реальная ли это задача? Если реальная, буду очень признателен за примерчик программы где звук.файл фильтруется заданным диапазоном частот (лучше на c/cpp или на java). Большое спасибо!!! Добавлено через 1 минуту и 53 секунды Или может быть такая прога уже существует? |
|||
|
||||
seatouch |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 27.11.2008 Репутация: нет Всего: нет |
По сути, надо написать 108 полосный эквалайзер, который пишет в выходной файл на какой полосе в какой момент времени уровень выше заданного.
|
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Работа со звуком | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |