Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Intro
Зарегистрирован: 04.08.2004 Сообщения: 6 Откуда: Барнаул
|
Добавлено: Ср Авг 04 2004 12:15 Заголовок сообщения: Помогите с функцией!(Visual C++) |
|
|
Я разрабатываю проэкт сравнения двух wav файлов. Открываю wav файлы с помощью обычных потоков файлового ввода-вывода(возможно кому-то это покажется топорным ). Моя начальная цель програмно вычислить то место, где у wav начинается основная часть(то есть звук). Зачем это нужно? Чтобы потом написать программу сравнивающую звук обоих файлов и выводящую процентное соотношение похожести.
Сама программа написана и работает, но основная часть, то есть функция сравнения не коректно выводит результаты! --- при компиляции ошибок замечено не было.
P.S. ... Результат сравнения двух одинаковых файлов : 268 совпадений при размерах файлов 7 мегабайт
Вот функция :
void sravn_file(ifstream& wave1in, ifstream& wave2in, ofstream& result)
{
char w1,w2;
while(! wave1in.eof() || ! wave2in.eof())
{
wave1in.get(w1);
wave2in.get(w2);
if (w1 == w2)
{
i++; //это переменная-счётчик обьявленная как глобальная
result.put(w2);
cout << w2;
wave1in.get(w1);
wave2in.get(w2);
}
}
}
//Не судите меня строго я только начинающий. |
|
Вернуться к началу |
|
|
Слуга дяди Билла Гость
|
Добавлено: Ср Авг 04 2004 13:45 Заголовок сообщения: |
|
|
Ну найти свою ошибку - целое искусство . Помню у нас было несколько лекций с одной лишь целью - научить находить ошибки . Свои ошибки найти очень-очень трудно , чужие - на грани умопомешательства . |
|
Вернуться к началу |
|
|
Intro
Зарегистрирован: 04.08.2004 Сообщения: 6 Откуда: Барнаул
|
Добавлено: Ср Авг 04 2004 15:00 Заголовок сообщения: Ну тогда поставлю вопрос по другому... |
|
|
void sravn_file(ifstream& wave1in, ifstream& wave2in, ofstream& result)
{
char w1,w2;
while(! wave1in.eof() || ! wave2in.eof()) //Есть ли альтернатива данному условию цикла. НО важно, чтобы оба условия соблюдались в пространстве ИЛИ
{
wave1in.get(w1);//Есть ли альтернатива(wave1in << w1 --- не предлагать)?
wave2in.get(w2);//То же самое
if (w1 == w2)//правильно ли из логики такое сравнение?
{
i++;
result.put(w2);//Есть ли альтернатива(result << w2 --- не предлагать)?
cout << w2;
wave1in.get(w1);
wave2in.get(w2);
}
}
}
Господа предлагайте свои версии алгоритмов, если не жалко )) |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Ср Авг 04 2004 16:40 Заголовок сообщения: |
|
|
Вообще для побитового сравнения двух не слишком длинных файлов лучше воспользоваться винкоммандером.
А какой смысл сравнивать два ЗВУКОВЫХ файла побитно? Если хочешь определить похожесть двух РАЗНЫХ звуковых фрагментов то нужно использовать другие методы. Методов можно придумать много, но объединять их будет одно - сравнивание проходит не по одному единственному, а по группе отчетов. Если фрагменты ну очень похожи, записаны с разных микрофонов, буквально, можно считать коэффициент коррелляции квадратов амплитуд усредненных по нескольким соседним отсчетам. Если файлы отличаются сильнее - можно считать коррелляцию спектров этих двух сигналов. |
|
Вернуться к началу |
|
|
Intro
Зарегистрирован: 04.08.2004 Сообщения: 6 Откуда: Барнаул
|
Добавлено: Ср Авг 04 2004 17:28 Заголовок сообщения: |
|
|
grayrat писал(а): | Вообще для побитового сравнения двух не слишком длинных файлов лучше воспользоваться винкоммандером.
|
У меня стояла задача програмно сравнить файлы, а визуально, просмотрев их Far-ом я ничего не добьюсь --- уже пробывал --- много всяких символов разбросанных по экрану.
Сейчас главное найти то место, где заканчивается описание wav файла, его внтутренних характеристик таких как, например качество записи. Возможно в последствии всё это может пригодиться , так как выдрав то же самое качество записи его можно показать пользователю.
grayrat писал(а): |
А какой смысл сравнивать два ЗВУКОВЫХ файла побитно? Если хочешь определить похожесть двух РАЗНЫХ звуковых фрагментов то нужно использовать другие методы. |
М-да вот именно нужно использовать другие методы, то есть создавать новые алгоритмы... может кто-то уже занимался подобным сравниванием и имеет алгоритмы - не важно на каком языке они реализованы.
grayrat писал(а): |
Методов можно придумать много, но объединять их будет одно - сравнивание проходит не по одному единственному, а по группе отчетов. Если фрагменты ну очень похожи, записаны с разных микрофонов, буквально, можно считать коэффициент коррелляции квадратов амплитуд усредненных по нескольким соседним отсчетам. Если файлы отличаются сильнее - можно считать коррелляцию спектров этих двух сигналов. |
Я понял, то есть не должно быть строгого сравнивания if(w1==w2){............} ---- так как даже по- слуху одинаковые wav могут содержать разный код.
В любом случае метод по-битового сравнивания не подходит...
Нужно как-то преобразовать wav в график функций, где потом для сравнивания следует применить алгебраические или даже геометрические методы... |
|
Вернуться к началу |
|
|
DmitryShm
Зарегистрирован: 17.11.2003 Сообщения: 211 Откуда: Казань
|
Добавлено: Чт Авг 05 2004 10:01 Заголовок сообщения: по методам можно задать вопрос на форуме www.autex.spb.ru |
|
|
Сравнивать надо по разумной норме. Если взять wav-файл и рассамтривать все wav, которые побитово различаются на некоторую фиксированную величину, то получишь не то, что хотел. Это не похожесть. По-поему, тебе надо сравнивать не побитово, а повекторно, используя преобразования Фурье (и обратное), чтобы, отбрасывая наименее значимые коэффициенты, сравнивать основные части -- это будет похожестью. Еще можно использовать вейвлеты. Резонно будет задать этот вопрос на www.mmonline.ru. Код писать не буду ввиду занятости. В случае Фурье код прозрачен. С вейвлетами будет потруднее..
PS: Если ты только тренируешься в программировании, то по-моему, взял не ту проблему для решения, т.к. эта проблема требует знания азов функционального анализа. _________________ love IT |
|
Вернуться к началу |
|
|
|