|
|
||
|
Музыка по жанрам Еще по теме Материалы о музыке |
Теги страницы: Одним синусом нам не обойтись. Важно понять, что когда вы «резонируете» исходную волну с синусоидальной волной, определенной амплитуды, конечная амплитуда зависит от фазы синусоидальной волны. Фаза - это мера сдвига графика функции вправо или влево. Представьте, что у вас есть две исходных синусоидальных волны с частотой 440Гц и амплитудой 5. Фаза волны 1 равняется нулю. Если вы будете «резонировать» эти волны, то результирующие амплитуды получатся разными. Амплитуда для волны 1 получится больше амплитуды для волны 2. Волна 1 имеет экстремальные значения 5 и при этом резонирующая волна принимает экстремальные значения 1 и -1, с другой стороны, в тех где принимает свои экстремальные значения волна 2, резонирующая волна равна нулю. Другими словами, резонирующая волна «пропускает» экстремальные значения волны 2 из-за того, что она просто сдвинута (или, говоря техническим языком, имеет другую фазу). Когда исходная волна принимает максимальное значение, резонирующая волна равна нулю; когда принимает максимальное значение резонирующая волна, нулю равна исходная волна. Это приводит к тому, что итоговая амплитуда, чем должна бы быть. Чтобы решить эту проблему, вы используете ко синусоидальную волну. Эта волна точно такая же, как и синусоидальная, за исключением того что она в нуле принимает значение единица, в то время как синус в нуле равен нулю. Другими словами, косинус - это синус с другой фазой. Совет.На самйм деле, можно математически доказать, что любая периодическая функция с постоянной частотой и амплитудой вне зависимости от фазы, может быть представлена суммой синуса и косинуса. Яне буду предоставлять здесь доказательство этого факта, но предлагаю вам изучить ссылки приведенные на вашем CD. Если вы «срезонируете» исходную волну, и с косинусом и с синусом, то вы гарантированно получите одну и ту же итоговую амплитуду, вне зависимости от фазы («величины сдвига») вашей исходной волны. Синус и косинус как бы прикрывают друг друга - когда один из них равен нулю, второй принимает максимальное значение, так что вы гарантированно никогда не «пропустите» максимумы вашей исходной волны. Используя и синус, и косинус, мы получаем следующий код. Этот код очень похож на тот, который вы видели немного раньше, за исключением того, что кроме синуса используется еще и косинус. Также добавилась строчка, которая вычисляет amp как квадратный корень из суммы квадратов sinamp. На самом деле, это всего лишь замаскированное вычисление расстояния. Что вы хотите найти расстояние от начала координат до точки (3, 4). Чтобы найти расстояние от начала координат до этой точки, вы возводите обе компоненты в квадрат, потом складываете их и извлекаете квадратный корень из суммы. 3 в квадрате — это 9,4 в квадрате - это 16. 9 плюс 16 - это 25. так что итоговое расстояние - это квадратный корень из 25, т. е. 5. Если вы нарисуете двухмерный график, откладывая sinamp по одной оси и cosamp по другой оси, то вы можете посчитать итоговое усиление как расстояние до точки (cosamp, sinamp). Если вы чего-то не понимаете, то есть множество математических рассуждений, объясняющих, почему это так - посмотрите ссылки, которые я поместил на ваш CD; разбираться в этом очень и очень интересно, при этом вы познакомитесь с использованием мнимых чисел некоторыми другими причудливыми понятиями. И теперь, наконец-то, у вас есть самые важные знания, необходимые для реализации анализатора спектра: вы знаете, как выяснить, «насколько много» конкретной частоты содержится в wave файле. Теперь, после того как вы это узнали, все, что вам нужно сделать, - это произвести аналогичные действия, используя несколько различных значений freq, и вы получите на выходе массив, подходящий для графического отображения. Число Найквиста. Единственное, что осталось решить, - это какие частоты использовать. Чтобы решить это, вы должны сначала понять, что такое число Найквиста. Число Найквиста, в данном случае, представляет собой максимальную частоту, которая может быть корректно захвачена с заданной заранее частотой. К примеру, представьте себе исходную волну с частотой 10Гц, захваченную с частотой дискретизации 20Гц. Я взял такие небольшие числа только для того, чтобы проиллюстрировать понятие - как вы знаете, обычно захватываются с частотой дискретизации 22,050Hz или 44,100Hz, но для этого примера давайте отбросим соображения качества и будем использовать частоту 20 Гц. Захват I ОГи волны с частотой дискретизации 20Гц вряд ли даст нам качественный звук, но, тем не менее, итоговый результат будет корректен. Теперь, представьте, что вы пытаетесь захватить волну частоты 30 Гц с частотой дискретизации 20Гц. Набор выборок, полученный вами, не будет иметь никакого смысла, потому что волна осциллирует быстрее, чем вы способны это заметить. Это называется эффект наложения (aliasing) и является звуковым аналогом визуального эффекта, который заключается в том, что быстрые лопасти вертолета и автомобильные покрышки кажутся крутящимися назад. Конечно, на самом деле они назад не крутятся - просто частота визуальной дискретизации слишком мала, чтобы заметить настоящее движение, и из-за этого создается иллюзия вращения в противоположную сторону. Число Найквиста - это максимальная частота, которую вы можете на заданной частоте дискретизации без получения чересчур сильных эффектов наложения. Оно всегда равняется ровно половине частоты дискретизации. Таким образом, при частоте дискретизации 44100Гц максимальная частота, которую вы можете захватить, 22050Гц. Теорема 10п икона (Найквиста): произвольный сигнал, спектр которого не содержат частот FB, может быть полностью восстановлен, если известны отсчетные значения этого сигнала, взятые через равные промежутки времени !FB)C. Теперь, в конце концов, вы собрали все кусочки головоломки вместе. Вы знаете, как выяснить, содержит ли волна определенную амплитуду, и теперь, благодаря числу Нанкпнста. вы знаете максимальную частоту, на которую вам нужно смотреть. Все, что осталось, - это добавить еще один цикл, к уже известному коду. Переменная freq теперь называется bin, цикл проходит по всем частотам от нуля до частоты Найквиста, и итоговая амплитуда теперь является массивом амплитуд для каждой частоты. Анимация анализатора спектра. Этот код даст вам амплитуды различных частот, содержащихся во вш ном волне. Чтобы реализовать анимацию анализатора спектра, все, что вам нужно сделать, - это рассчитать амплитуды частот для небольшого кусочка входной волны, начиная от той выборки, что звучит в динамиках, и заканчивая несколькими байтами позже (512 будет хорошим выбором). Вы узнаете об этом подробнее в последующих разделах. Пример программы. Поздравляю, вы пробрались через дебри теории, окружающей анализатор спектра. Теперь настало время засучить рукава и сделать его! Последующие разделы продемонстрируют вам работу кода, содержащегося в примере программы Chl7pl_Visuals. Как вы можете увидеть, графический интерфейс пользователя минимален, он состоит всего из двух кнопок, просмотра и воспроизведения, расположенных сверху большого прямоугольника, где отображается анализатор спектра. Загрузка файла. Пример программы, как и его собрат из главы 2, использует DiiectSound, низкоуровневый интерфейс DirectX Audio. Я выбрал для использования DirectSound в основном по той причине, что в DirectSound гораздо проще, чем в DirectMusic, понять, какой байт выборки звучит в колонках в данный момент времени. К тому же так окончание книги получается симметричным - мы начали книгу с низкоуровневого API и в конце книги мы возвращаемся к низкоуровневому API. К сожалению, использование DirectSound подразумевает самостоятельную загрузку файла — вы не можете просто загрузить его в сегмент DirectMusic. Чтобы немного облегчить себе задачу, вы можете использовать содержащийся. Этот кусок кода был взят из функции LoadSound программы Chl7pl_Visual. Код загружает WAV в wavfile, закрывает вторичный буфер DirectSound, заполняет его содержимое и открывает его (обратитесь ко второй главе, если вам нужно вспомнить, как открыть и закрыть буфер DirectSound). CDiscreteFourierTransform. Chi 7pl Visual основывается на новом классе - CDiscreteFourierTransform. Этот класс был создан, чтобы содержать все данные и методы необходимые для проведения дискретного преобразования Фурье. Вот его объявление. Ничего особенно сложного - основными членами являются три указателя: m Input, m FivqOutput и m AmpOutput. Это динамические массивы чисел с плавающей точкой - их размер зависит от размера буфера (in_BuiS!ze). Массив m i 11 put используется для хранения массива входных выборок. Массив используется для хранения амплитуд частот - сердца анализатора спектра. сообщает коду частоту по заданному номеру элемента массива. Это необходимо, чтобы добавлять метки в анализаторе спектра. |
|