Академический Документы
Профессиональный Документы
Культура Документы
Аллен Б. Дауни
Think DSP
Цифровая обработка сигналов на Python
Think DSP
Digital Signal Processing in Python
Allen В. Downey
Алл.ен Б. Дауни
ISBN 978-5-97060-454-0
УДК 534:004.438Python
ББК 22.32с
Все права защищены. Любая часть этой книги не может быть воспроиз
ведена в какой бы то ни было форме и какими бы то ни было средствами без
письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, по
скольку вероятность технических ошибок все равно существует, издательство
не может гарантировать абсолютную точность и правильность приводимых
сведений. В связи с этим издательство не несет ответственности за возможные
ошибки, связанные с использованием книги.
Оr.nав.nение
Некоррелированный шум .
.. . . .. .. . . . . . .................................... . . ... . . . . . . . 48
Интегральный спектр ......... " . . " . . . . . . . . . . . . . . . " " . . . . . . . . . . . . . . . . . . . " . . . . " . . " . . . 51
Броуновский шум .
. . . . . . . . . . .. . . . . . . . . . . . . . . . . . .
... . . . ... .. . ...
. . ... . .. ..
.... .. . . 52 . .... . . . . .
Розовый шум . ........... " " . . . . . . . . . . . . . . . " " " " " . . . . . . . " . . . . . . . . . . . . " " . . . . . . " . . " . . . 55
Гауссов шум ........ "................"""...............".............. ""."." ...."... 57
Упражнени я . . . " " . . . . . . . . . . . . . . . . . . " . . " . . . . . . . . . . . " " . . . . . . . . . . . . . . . . . . . . . . . . " . . . . . . . . . . . 59
ДКП-IV " . . . . . . . . . . . . . . " " . . . . . . . " . . " " . . . . . . . . . . . . . . . . " . . . . . . . . . . . . . " . . . . . . . . . . " . . " 80
.......
Класс Dct....................................................................................... 82
Упражнения . . ... . . . .. . . ... . ............. ........ . ... . . . . . . . . . . . . . ... . . . . . . . . . . . . . . . . . . . . . . 83
. . . .
Интерп ол я ци я " .......... " " " " ..... " .. " " ..... " " ... " .. " ..... " " ... " ... " " ... " 148
Итог ... " ............. " " ..... " ........... " " " ..... " .. " ..... " ..... " " ........ " " ....... 150
Упражнени я ................................................................................. 151
Об обложке.................................................... 159
В ведение 1111•••"
У книги есть один недостаток - не введено понятие аналитического
сигнала. Но большинство читателей от этого только выигрывает! Ведь,
изучив материал книги, им будет заметно проще перейти от обработки
записи звука скрипки к об работке нестационарных случайных сигналов -
от радиолокаторов или гидроакустических станций до ультразвуковых
диагностических приборов или масс-спектрометров и газоанализаторов.
Список корреспондентов
Предложения или замечания по поводу книги направляйте на
downey@allendowney . com. Если на основе ваших сообщений будут
сделаны изменения, то автора сообщения добавят в список коррес
пондентов (при отсутствии специальных условий).
Желательно указывать хотя бы часть предложения, в котором об
наружена ошибка, - так ее легче найти. Можно сослаться и на номер
страницы или название раздела, хотя это осложняет поиск. Спасибо
за понимание!
• Прежде чем автор приступил к написанию этой книги, идеи,
которые легли в ее основу, развивались в общении с Булосом
Хэрбом (Boulos Harb) из Google и с Аурелио Рамосом (Aurelio
Ramos), ранее работавшим в Harmonix Music Systems.
• Во время осеннего семестра 20 1 3 года Натан Линц (Nathan
Lintz) и Ян Дэниэр (lan Daniher) работали со автором над не
зависимым учебным проектом и помогли с первым изданием
этой книги.
• На DSР-форуме Reddit пользователь под ником Ramjetsound
wave помог решить проблему с реализацией броуновского
шума. Другой участник форума, andodli, нашел опечатку.
• Весной 20 1 5 года этот материал преподавался совместно с
проф. Оскаром Мур-Мирандой (Oscar Mur-Miranda) и проф.
Сиддхартаном Говиндасами (Siddhartan Govindasamy). Оба
внесли много предложений и исправлений.
• Сайлас Гигер (Silas Gyger) исправил арифметическую ошибку.
• Джузеппе Мазетти (Giuseppe Masetti) прислал ряд полезных
замечаний.
Особая благодарность техническим рецензентам - Эрику Петерсу
(Eric Peters), Брюсу Ливенсу (Bruce Levens) и Джону Винсенту Qohn
Vincent) - за многие полезные замечания, разъяснения и исправле-
ния.
Также благодарность Freesound, источнику многих звуков, исполь
зуемых в книге, и пользователям Freesound, предоставившим их. Не
которые из них включены в репозиторий GitHub этой книги, причем
использованы оригинальные имена файлов, так что источники легко
найти.
К сожалению, большинство пользователей Freesound не указывает
своих имен, поэтому здесь можно привести только их ники. Образцы
В ведение 11111••111
звуков, используемые в книге, были предоставлены пользователями
Freesound - iluppai, wcfl 1 О, thirsk, docquesting, kleeb, landup, zippi 1 ,
themusicalnomad, bcjordan, rockwehrmann, marcgascon7, jcveliz.
Спасибо им всем!
----···
r11ава 1.
Звуки и сиrна11ы
0.5
о.о
- 0 .5
-1.0 � � � � �
� � �
о. оо-о- - 0-
. 0 0 1- -
-.� 0 0 .,.--
о 2 о. о'"'""
___,. о_,.. .,.
оз=--____ .. о -____
04 - 0 . ооб"' ,---
о._,. о"'оs=-----:-
Вр е мя (с) +7
О.О
-0.5
-1.0
�О-. � О О 4- �-О
О Оl��� �� ��О-. � �00-5
. О Об�-0-0
�-О� . � . � 07
+ 1.302
Время (с)
Разложение в спект р
Самая важная тема этой книги - разложение в спектр. Суть ее в том,
что любой сигнал можно представить суммой синусоид с разными
частотами.
Самая важная математическая идея в этой книге - дискретное
преобразование Фурье (ДПФ). Оно берет сигнал и выдает его спектр.
Спектр - это набор синусоид, составляющих сигнал.
А самый важный алгоритм в этой книге быстрое преобразование
-
3500
3000
2500
�
� 2000
2
:1:
<( 1500
1000
500
1.5
1.0
0.5
о.о
-0.5
-1.0 -
-1.5 -.__--�--�--�--�---'----�--'
О.ООО 0.001 0.002 0.003 0.004 0.005 0.006
Время (с)
Рис. 1.4. Сегмент сигнала из смеси двух синусоид
" ••.... � Гла1 а 1. Э1уки и си rнал ы
При freq = 440 за 0,5 секунды пройдет 220 периодов, так что при
печати этот участок будет представлен сплошной заливкой. Меньшее
число периодов можно вывести, используя segment он копирует не -
Спектры
wave поддерживает make_spect rum, возвращающий спектр� spec
trum:
spect rum = wave . ma ke_spect rum ( )
О бъекты Wave
В thinkdsp.py нет ничего сложного. Большинство функций в нем -
лишь тонкие обертки на функциях из NumPy и SciPy.
Основные классы в thinkdsp - это s ignal, wave и Spect rum. Имея
signal, можно сделать wave. Имея wave, можно сделать Spect rum, и
наоборот. Эти соотношения показаны на рис. 1 .5.
для всех типов сигналов, таких как make_wave. Дочерние классы на
следуют эти методы и дают evaluate, оценивающий сигнал в задан
ные моменты времени.
Например S inusoid это дочерний класс s i gnal с таким опреде
-
лением:
c l a s s S i nu s o i d ( s i gnal ) :
r11ава 2.
rармон ики
Треугольный сигнал
У синусоиды только одна частотная компонента, поэтому в ее спектре
лишь один пик. Более сложные сигналы, вроде записи звука скрипки,
показанной на рис. 1 .2, дают ДПФ со множеством пиков. В этом раз
деле исследуется связь между формой сигналов и их спектрами.
Начнем с треугольного сигнала, похожего на спрямленную версию
синусоиды. На рис. 2. 1 показан треугольный сигнал частотой 200 Гц.
Генерацию треугольного сигнала начнем с thinkdsp . Triangle
Signa l:
c l a s s TriangleSigna l ( S i n u s o i d ) :
de f evaluate ( s e l f , t s ) :
cycles = Se l f . freq * t s + s e l f . o f f s e t / P I 2
frac , _ = np . modf ( c y c l e s )
y s = np . abs ( frac - 0 . 5 )
ys = norma l i z e ( unbias ( ys ) , s e l f . amp )
return ys
1.0
0.5
О.О
-0.5
-1.0.
�.,,... � �
7 оо,,---.,.-..,..,._-,,..
о. о ,.
о._.,оо ..,
4- ..,.
О�. оо.,.,
б,---..,,
о� . о"""ое,,-"""'
- о"".0 1 0 - 1 4
0 . ,- о ,...,
.,,-..,.--
-'с ---.,
Время (с)
Рис. 2. 1. Сегмент треугольного сигнала частотой 200 Гц
2000 400
�"'
"
j 1000 200
500. 100
0
о
1 1
1000 2000 3000 4000 5000 °о
l
1000
1 1
2000
1 1 •
3000 4000 5000
Частота (Гц) Частота (Гц)
Рис . 2.2. Спектр треугольного сигнала 200 Гц, с двумя шкалами
по вертикали . У правого об резана основная , чтоб ы четче показать
гармоники
de f eva l uate(s e l f , t s ) :
cycles = Se l f . freq * ts + s e l f . o f f s e t / P I 2
f r a c , _ = np . modf ( c ycl e s )
ys = s e l f . amp * np . s i gn(unb i a s(frac ) )
return ys
0.5
о.о
-0.5
-1.0 ._____,
О.ООО 0.005 0.010 0.015 0.0 2 0 0.02 5 0.030
Время (с)
Рис. 2. 3. Сегмент прямоугольного сигнала 100 Гц
3000
2 500
� 2000
�
:s:
� 1500
"
<{
1000
500
Биения (алиасинг)
Примеры для предыдущего раздела выбраны так, чтобы все было по
нятно. А вот этот раздел вас может и озадачить.
Для начала рассмотрим рис. 2.5.
2500 500
2000 400
1 500 300
"'
q
�
" ·
"
с:
:i: 1000 200
<(
500 100
о �-�
о ..,.
1 00 0-...,.
.,..
20 0�
0 -,...
30..,..
1
., 00�-4..,.
оо""о�
"
1
-'
5000
о 1
о�-1'"'
1
20
о�-='
00..,_
1
.,.
0�0. �3
,_,
•
оо�-4..,.
о..., ОО
.1
о�.,,.,.
..,. 5000
Частота (Гц) Частота (Гц)
Рис . 2 . 5 . Спектр треугол ьного сигнала 1 100
Гц при 10 ООО выборок
в секунду. В ид справа масштабирован дл я выявления гармоник
s i gn a l = t h i n kdsp . Co s S ignal ( 5 5 0 0 )
segment = s i gnal . ma ke_wave ( du r a t i o n , f ramerate=framerate )
s egment . p l o t ( )
100 Гц.
1.0 -
0.5
\
1 \ 1- 4500 1
о.о J
! 1 ·
-0.5
\ ; /
- 1 . 0 �����- /�������-/������������
0 . 0000 0.0001 0 . 00 0 2 0 . 0003 0 . 0004 0 . 0005 0 . 0006 0 . 0007
0.5
1
о.о
i�емя
1 i
(с)
-0.5
- 1 . 0 �����
0.0000 0.0001 0 . 0002 0.0003 0 . 0004 0 . 00 0 5 0 . 0006 0 . 00 0 7
Time ( s )
Рис. 2 .6. Косинус-сигналы 4500 и 5500 Гц, вы борка 10 ООО кадров
в секунду. Вы борки одинаковы при разных сигналах
Вычисnе ние спектра 1111•••11J1
Этот эффект называется биениями, или шиасинzом (aliasing), по
тому что выборки из сигнала с высокой частотой кажутся выборками
из сигнала с низкой.
В этом примере самая высокая частота, которую еще можно обра
ботать, составит 5000 Гц (половина частоты дискретизации). Частоты
выше 5000 Гц •заворачиваются• вокруг 5000 Гц, так что этот порог
иногда называют частотой заворота. Встречается также термин час
тота Найквиста; см. http : / / ru . wi kipedia . org/wi ki /Чacтoтa_
Найквиста.
Заворот повторяется, когда частота биений оказывается меньше
нуля. Например, пятая• гармоника треуrольноrо сигнала 1 100 Гц со
ставит 12 1 00 Гц. Заворот на 5000 Гц даст - 2 1 00 Гц, но на О Гц будет
новый заворот, и он даст 2 1 00 Гц. В самом деле, на рис. 2.4 заметен
небольшой пик на 2 1 00 Гц, а также следующий, на 4300 Гц.
В ы числение спектра
Метод make_spectrum у объекта wave уже встречался. Применим
его еще раз (некоторые детали рассмотрены ниже):
from np . f f t import r f f t , r f ft freq
f class wave :
de f make_spect rum ( s e l f ) :
n = len ( s e l f . ys )
d = 1 / s e l f . f ramerate
hs = r f f t ( se l f . ys )
f s = r f f t freq ( n , d )
выборками.
np . f f t это модуль NumPy, дающий функции для быстрого преоб
-
Упражнен и я
Решения этих упражнений находятся в блокноте chap02 soln.ipynb.
Упражнение 2. 1
Для Jupyter надо загрузить chap02 . ipynb и примеры. Этот блок
нот можно также просмотреть на веб-странице http : / / tinyurl .
com/ thinkdsp02.
Упражнение 2.2
Пилообразный сиrнал линейно нарастает от - 1 до 1 , а затем резко
падает до - 1 и повторяется. См. http : / /en . wikipedia . org/wi ki /
Sawtooth_wave (на англ. яз.).
Напишите класс, называемый SawtoothS ignal , расширяющий
signal и предоставляющий eva luate для оценки пилообразного
сигнала.
Вычислите спектр пилообразного сиrнала. Как соотносится его
гармоническая структура с треугольным и прямоугольным сигна
лами?
Упражнение 23
Создайте прямоугольный сиrнал 1 100 Гц и вычислите wave с вы
борками 10 ооо· кадров в секунду. Постройте спектр и убедитесь, что
большинство гармоник •завернуты• из-за биений. Слышны ли по
следствия этого при проигрывании?
Упражнение 2.4
Возьмите объект spectrum и распечатайте несколько первых зна
чений spectrum. fs. Убедитесь, что они начинаются с нуля, то есть
Spect rum.hs [ O J - амплитуда компоненты с частотой О. Но что это
значит?
Проведите такой эксперимент:
1. Создайте треугольный сигнал с частотой 440 Гц и wave дли
тельностью 0,0 1 секунд. Распечатайте сигнал.
2. Создайте объект Spect rum и распечатайте Spectrum.hs [ О 1 .
Каковы амплитуда и фаза этого компонента?
3. Установите Spectrum . hs [ О ] = 1 0 0 . Как эта операция повли
яет на сиrнал? Подсказка: Spectrum дает метод, называемый
make_wave, вычисляющий wave, соответствующий Spect rum.
Упражнение 2.5
Напишите функцию, принимающую Spect rum как параметр и из
меняющую его делением каждого элемента hs на соответствующую
Гnааа 2. Гармоники
r.naвa 3.
Аnери од и 11 е ск ие с и r на 11•1
Л иней ны й ч и р п
Рассмотрим чирп, сигнал с переменной частотой. thinkdsp дает
signal, называемый Chi rp, который создает синусоиду с частотой,
линейно изменяющейся в некотором диапазоне.
Вот пример с перестройкой от 220 до 880 Гц, то есть на две октавы -
от АЗ до А5:
s i gnal = t h i n kdsp . Ch i rp ( s t a rt=2 2 0 , end=8 8 0 )
wave = s i gna l . ma ke_wave ( )
1.0 f r
0.5
о.о
-0.5
- 1.0
��-�-�-�� \J \J
о 0 10 500 502 504 506 500 510 900 902 904 906 900 910
Время (мс)
Рис . 3 . 1 . Чирn-сигнал в начале, в середине и в конце
Экспонен ци ал ьн ы й ч и р п
Слушая этот чирп, можно заметить, что высота звука сначала резко
нарастает, а затем рост замедляется. Чирп занимает две октавы, но
первую он пролетает всего за 2/3 s, а вторую - в два раза медленнее.
Причина в том, что восприятие высоты звука зависит от логариф
ма частоты. В результате слышимый между двумя нотами интервал
зависит от соотношения их частот, а не от их разницы. Интервал -
" ••.... � Г11аеа З. Апериодические си rнапы
de f eva l uate ( s e l f , t s ) :
s t a r t , end = np . log l O ( s e l f . s t a rt ) , np . l o g l O ( s e l f . end)
f reqs = np . l ogspace ( s t a r t , end, len ( t s ) - 1 )
return se l f . _eva luate ( t s , f reqs )
Спектр чирпа
Выясним, что получится при вычислении спектра чирпа. Вот пример,
создающий односекундный однооктавный чирп и его спектр:
s i gnal = t h i n kdsp . Ch i rp ( s ta r t = 2 2 0 , end= 4 4 0 )
wave = s i gnal . ma ke_wave ( du r a t i o n= l )
spect rum = wave . ma ke_spect rum ( )
300
g
"'
250
"
J
с:
200
150 .
100
50
Частота ( Гц)
Рис. 3.2. Спектр односе кундного однооктавного чирпа
С пектр огр а мм а
Чтобы проявить связь между частотой и временем, можно разбить
чирп на сегменты и построить спектр каждого сегмента. Результат
называется кратковременным преобразованием Фурье (КВПФ).
Есть несколько способов визуализации КВПФ, но наиболее рас
п ространены спектрогра.ммы , у которых на оси х время, а на оси у -
частоты. Каждый столбец на спектрограмме показывает спектр ко
роткого сегмента, а для представления амплитуд используются цвет
или оттенки серого.
В качестве примера вычислим спектрограмму такого чирпа:
signal = thinkdsp . Ch i rp ( s t a r t =2 2 0 , end=4 4 0 )
wave = s i gna l . ma ke_wave ( du r a t i o n= l , f ramerate= 1 1 0 2 5 )
частоты выборки.
700 ,------�---�---.
600
500
З'
!::. 400
:" '
g
� · 300
:т
200
100
Предел Габора
Разрешение по времени спектрограммы зависит от длительности сег
ментов, соответствующих ширине ячеек спектрограммы. Каждый
сегмент состоит из 5 1 2 кадров, а всего их 1 1 02 5 за секунду, длитель
-
Уте ч ка
Ниже рассматривается работа ma ke_ spect rogram; работа его основа
на на окнах; но прежде чем их изучать, разберемся с утечкой - именно
из-за нее нужны окна.
Дискретное преобразование Фурье (ДПФ), используемое для вы
числения Spect rum, обрабатывает сигналы, предполагая их перио
дичность; то есть конечный сегмент считается полным периодом бес
конечного, непрерывно повторяющегося сигнала. На практике это
предположение часто ложно, и отсюда возникают проблемы.
Одна из распространенных проблем - разрыв между началом и кон
цом сегмента. При ДПФ предполагается, что сигнал периодический,
поэтому начало и конец сегмента неявно соединяются в петлю. Если
конец не совпадет с началом, то из-за разрыва в сегменте появятся до
полнительные частотные компоненты, которых нет в сигнале.
Рассмотрим в качестве примера синусоидальный сигнал, содержа
щий только одну компоненту с частотой 440 Гц:
s i gnal = t h i n kdsp . S i n S ignal ( f req=4 4 0 )
а заканчивается на 1 .
Н а рис. 3.4 (в центре) показан спектр этого сегмента. Опять же ви
ден пик на 440 Гц, но теперь появились некие компоненты, которые
«размазаны� в диапазоне от 240 до 640 Гц. Эту «размазню� и назы
вают утечкой спектра, поскольку некоторая часть энергии основной
частоты утекает в другие частоты.
На рис. 3.4 (справа) показан спектр сигнала, прошедшего окно.
С ним утечки сократились заметно, но не полностью.
400 350 200 ,---�-�-�-.--,
350 300
300 150
250
250
200
200 100
150
150
100
100 50
50 50
о
о 0
200 400 600 800 0 200 400 600 800 200 400 600 800
Частота (Гц)
Рис. 3.4. С пектры периодического сегмента синусоиды (сл ева ) ,
апериодического сегмента ( в центре ) и апериодического сегмента
с окном (справа)
О кна
Утечки можно уменьшить, сглаживая разрыв между началом и кон
цом сегмента, и один из способов добиться этого - использование
окон.
О кна
1111•••Е1
Окно это функция, преобразующая апериодический сегмент в не
-
-0.5
- 1 . 0 �-
--�----�--�
О .ООО 0.005 0.010 0.015 0.020
1.0
0.5
о.о
-0.5
Время (с)
Рис. 3 . 5. Сегмент синусоиды ( вверху ) , окно Хэмминга ( средний )
и про изведение сегмента и о кна ( внизу)
... . ..... � Глава З. Апернодическне сн rнаnы
Вот как выглядит код. wave дает window, включающее окно Хэм
минга:
f c l a s s wave :
de f wi ndow ( s e l f , w i ndow ) :
s e l f . ys * = wi ndow
spec_map = ( 1
wh i l e j < len ( s e l f . ys ) :
segmen t = s e l f . s l i ce ( i , j )
s egmen t . wi ndow ( wi ndow )
t = ( s egment . s t a r t + s egmen t . en d ) / 2
spe c_map [ t ] = segme n t . ma ke_spect rum ( )
i += s tep
j += s tep
return Spect rogram ( spec_map , seg_l ength )
Это самая длинная функция в книге, так что если в ней разобрать
ся, все остальное покажется простым.
Параметр s e l f - это объект wave; seg_l ength - количество вы
борок в каждом сегменте.
wi ndow - окно Хэмминга с той же длиной, что и у сегментов.
i и j - индексы фрагментов, выбираемых из сигнала; s tep - смеще
ние между сегментами. Поскольку s tep - это половина seg_length,
Реаn и заци• сnектроrрамм 1111•••Е1
сегменты наполовину перекрываются. На рис. 3.6 показано, как вы
глядят перекрывающиеся окна.
spec _map - это указатель, сопоставляющий метки времени со
Spect rum.
Упражнения
Решения этих упражнений находятся в блокноте chap O З soln.ipynb.
Упражнение 3. 1
Запустите и прослушайте примеры из блокнота сhарО З . ipynb.
Вы найдете его в репозитории этой книги, а также на веб-странице
http : / / t inyurl .com/ thinkdsp O З .
В примере с утечкой замените окно Хэмминга одним из окон, пре
доставляемых NumPy, и посмотрите, как они влияют на утечку. См.
h t tp : / / do c s . s c i p y . o r g / do c / nump y / r e fe re n c e / rou t i n e s . w i n -
dow . html .
Упражнение 3.2
Напишите класс, называемый S awtoothCh i rp, расширяющий
Chirp и переопределяющий evaluate для генерации пилообразно
го сигнала с линейно увеличивающейся (или уменьшающейся) час
тотой.
Подсказка: надо совместить функции evaluate из Chirp и
SawtoothS igna l .
Нарисуйте эскиз спектрограммы этого сигнала, а затем распеча
тайте ее. Эффект биений должен быть очевиден, а если сигнал вни
мательно прослушать, то биения можно и услышать.
Упражнение 3.3
Создайте пилообразный чирп, меняющийся от 2500 до 3000 Гц,
и на его основе сгенерируйте сигнал длительностью 1 с и частотой
кадров 20 кГц. Нарисуйте, каким примерно будет Spe ct rum. Затем
распечатайте Spect rum и посмотрите, правы ли вы.
Упражнение 3.4
В музыкальной терминологии глиссандо это нота, меняющаяся от
-
r11ава 4.
Шум
de f eva l uate ( se l f , t s ) :
ys = np . random . un i form ( - se l f . amp , se l f . amp , len ( t s ) )
return ys
Н екоррелиро 1анн w й wум lllll••llfl
Uncorre latedUn i formNoi s e наследует _Noise, наследующий
signal.
Как обычно, для оценки сигнала функция evaluate берет время
из ts. Она использует np . random . uniform, создающий значения из
равномерного распределения. В этом примере значения находятся
в диапазоне между -amp и amp.
Следующий пример генерирует UU-шум с длительностью 0,5 се
кунды на скорости 1 1 025 выборок в секунду:
s i gnal = thinkdsp . Uncorre l atedUn i fo rmNo i s e ( )
wave = s i gna l . ma ke_wave ( du r a t i o n = 0 . 5 , f ramerate= 1 1 0 2 5 )
0.5
о.о
-0.5
Время (с)
- 1.0 � � __._ _,
О . 0 0---- ____�
0 . 02 4 ___0 .О б____
.О- о .'-
ов___ О . 1 0
0
14000
12000 -
1 0000
"
1-
u
о
"' 8 000
:r
о
:о:
4000
2000
t:;
:s:
0.8
о
:i:
3'
о
>:
�
>:<
0.б
с;
о
с:
а
"
: 0.4
"'
:i:
�
с:
о
3 0.2
Броуновский шу м
UU-шум не коррелирован, то есть каждое его значение не зависит от
остальных. Ал ьтернатива броуновский шум, в котором каждое зна
-
de f evaluate ( s e l f , t s ) :
dys = np . random . un i form ( - 1 , 1 , l e n ( t s ) )
ys = np . cumsum ( dys )
ys = norma l i z e ( unbi a s ( ys ) , se l f . amp )
return ys
Вре мя (с)
Рис. 4 . 4 . С игнал б роуновского шума
de f e s t imate_s l ope ( se l f ) :
х = np . l og ( se l f . f s [ l : J )
"•••••• 1 Гnава 4. Шум
у = np . log ( s e l f . power [ l : ] )
t = s c ipy . s t a t s . l i nregre s s ( x , y )
return t
900000 г---�-�-�---�-. 1 06 -
1yi�
800000 1 05
10 •
�r�i 1I1·1
700000
600000 10 3
�
.а
500000 10 2 -
3"
о
:i;; 400000 101
300000 10 °
2 00000 10 · 1
100000 1 0- 2
0
о 1000 2000 3000 4000 5000 � о ·Э 10 1 102
Частота (Гц) Частота (Гц)
Рис. 4. 5 . С пектр б роуновского шума в линейном ( слева)
и в дво йном л огари ф мическом масштабе ( справа)
Розо вый шу м
У красного шума взаимосвязь между частотой и мощностью выража
ется следующей формулой:
Р = К / /2
В степени 2 нет ничего особенного. В общем случае можно синте
зировать шум с любой степенью, {3:
Р - К //1'
При f3 = О мощность неизменна на всех частотах, и в результате бу
дет белый шум. При f3 - 2 мы имеем красный шум.
Если f3 находится в пределах от О до 2, то результат будет между
белым и красным шумом - он называется розовым шумом.
Есть несколько способов получения розового шума. Проще всего
генерировать бе,лый шум и пропускать его через фильтр НЧ со ска
том, соответствующим нужной степени {3. thinkdsp дает класс, пре
доставляющий сигнал вида •розовый шум•:
c l a s s P i n kNo i s e (_No i s e ) :
de f �i n i t� ( s e l f , amp= l . O , beta=l . 0 ) :
se l f . amp = amp
se l f . beta = Ьеtа
чала сигнала; оно нужно для того, чтобы у ma ke_wave был единый
" •• •••• 1 Гnава .4 . Шум
интерфейс для всех типов сигнала, хотя для случайного шума время
начала не имеет значения. frame rate - количество выборок в се
кунду.
make_ wave создает сигнал белого шума, вычисляет его спектр, при
меняет фильтр с нужной степенью и преобразует отфильтрованный
спектр обратно в сигнал. Затем убирается постоянная составляющая
и нормализуется амплитуда.
Spect rum предоставляет pink_fil ter:
de f p i n k_fil ter ( s e l f , beta=l . 0 ) :
denom = s e l f . f s • • ( beta / 2 . 0 )
denom [ O J = 1
s e l f . h s /= denom
1.0
0.5
о.о
-0.5
0.04 О.Об
Время (с)
Рис. 4. 6. С игнал розового шума с р = 1
Гауссов wум 11111 ••"
Наконец, на рис. 4.7 спектры белого, розового и красного шума по
казаны на общей двойной логарифмической шкале. На этом рисун
ке очевидна взаимосвязь между показателем степени /З и наклоном
спектра.
10'
бел ы й
104
10'
10 2
.о
�
>-
3-
о
10 1
�
10°
10 "
10- 2
i o- ' ° 1
10 10 10 2
Гаусс ов шум
Выше уже был рассмотрен некоррелированный равномерный шум;
мы отметили, что его спектр имеет одинаковую среднюю мощность
на всех частотах, то есть это белый шум.
Но, когда речь идет о белом шуме, не всегда имеется в виду UU
шум. Часто в таких случаях подразумевают некоррелированный гаус
сов шум (UG).
thinkdsp поддерживает реализацию UG-шума:
c l a s s Unco rrelatedGau s s i anNoi s e (_No i s e ) :
de f evaluate ( se l f , t s ) :
ys = np . random . no rma l ( O , s e l f . amp , l en ( t s ) )
return ys
200 200
100 100
"
<t
�
"'
" о
с:
"
<(
- 1 00 - 1 00
Упражнения
Решения этих упражнений находятся в блокноте chap0 4 soln . ipynb.
Упражнение 4. 1
На сайте Soft Murmur можно послушать множество природных ис
точников шума, включая дождь, волны, ветер, и др. На неб-странице
http : / / asoftmurmur . com/abou t / приведен перечень записей; боль
шинство из них хранится на http : / / freesound . org.
Скачайте некоторые из этих файлов и вычислите спектры каждого
сигнала. Похож ли их спектр мощности на белый, розовый или броу
новский шум? Как спектр меняется во времени?
Упражнение 4.2
В шумовом сигнале частотный состав меняется во времени. На
большом интервале мощность на всех частотах одинакова, а на ко
ротком мощность на каждой частоте случайна.
Для оценки долговременной средней мощности на каждой часто
те можно разорвать сигнал на сегменты, вычислить спектр мощно
сти для каждого сегмента, а затем найти среднее по сегментам. Об
этом алгоритме можно прочитать подробнее на странице ht tp : / /
en . wikipedia . org/wiki /Bart lett ' s_method (на англ. яз.).
Реализуйте метод Бартлетта и используйте его для оценки спектра
мощности шумового сигнала. Подсказка: посмотрите на реализацию
make_spect rogram.
Упражнение 4.3
На веб-странице httр : / / www . coindes k . com/price можно скачать
в виде СSV-файла исторические данные о ежедневной цене BitCoin.
Откройте этот файл и вычислите спектр цен BitCoin как функцию
времени. Похоже ли это на белый, розовый или броуновский шум?
Глава .4 . Ш ум
Упражнение 4 .4
Счетчик Гейгера - прибор для обнаружения радиации. Когда иони
зирующие частицы попадают в детектор, на его выходе появляются
импульсы тока. Общий выход в определенный момент времени мож
но смоделировать некоррелированным пуассоновым шумом (UP),
где каждая выборка есть случайное число из распределения Пуассо
на, соответствующее количеству частиц, обнаруженных за интервал
измерения.
Напишите класс, называемый UncorrelatedPo i s sonNo i s e , насле
дующий thinkdsp . _Noi se и предоставляющий evaluate. Следует
использовать Np . random . p o i s s o n для генерации случайных вели
чин из распределения Пуассона. Параметр этой функции lam это -
r11ава 5.
А вто ко рре11•qи•
КорреляЦия
Обыч но корреляция между переменн ыми оз н ачает, что в каждой из
вестной величине есть некоторая информация о другой. Из несколь
ких способов оценки корреляции наиболее известен коэффициент
корреляции Пирсон а - произведе н ие моментов, обыч но обоз начае
мое р. Для двух переменных х и у, содержащих каждая N значений:
0. 5 .
о.о
-0. 5 .
- 1.0 ������
О . ООО 0.002 0.004 0.006 0.008 0.010
Время (с)
Рис. 5. 1. Для двух синусо идальных сигналов, отлича ющихся
п о фазе на 1 радиан, коэффициент корреляции - 0 , 54
Корреп1щи1 1111• ••111
Параметр ddo f О означает, что corrcoef следует делить на N, как
=
0.5
"
"'
�
"
" о.о
а.
а.
о
"'
-0.5
Сдв иг (радианы)
Рис. 5 .2 . Корреляция двух синусоидальных сигнал ов
в зависимости от разности фаз между ними. Это косинус
0.8
"'
"'
::r
"'
<::
�о О . б
"'
"'
"'
:i:
�
.о
0.4
�
g,"
§ 0.2
с
Авто корреляция
В предыдущем разделе корреляция вычислялась между каждым зна
чением и следующим за ним , поэтому элементы массива сдвигали
на 1. Но последовательную корреляцию леrко вычислить и для иных
интервалов.
serial_corr можно рассматривать как функцию, сопоставляю
щую значение lag соответствующей корреляции, и ее можно оценить,
перебирая значения lag в цикле:
de f autoco r r ( wave ) :
lags = range ( l en ( wave . ys ) / / 2 )
corrs = [ s e r i a l_co r r ( wave , l a g ) f o r lag i n lags ]
return lags , corrs
�
"'
0.6
"'
с;
8.
а.
� 0.4
0.2
800 1000
Lag
Рис. 5 .4. Автокорреляционные функции дл я розового шума
с набором параметров
4000
3500
3000
� 2 500
:о
� 2000 .
:;J
:r
1 500
1000
500 ......
Время (с)
0.6 о.в 1.0 1.2 1.4
раздел сПредел Габора•, стр. 40). Значит, ошибка в высоте тона может
быть до 50 Гц; в музыкальных терминах диапазон от 350 Гц до 450 Гц
составит 5 полутонов, а это большая разница!
Большее разрешение по частоте получим, взяв сегмент подлиннее,
но, поскольку высота тона меняется во времени, получится еще и
сразмытие•; то есть пик •размажется• между начальной и конечной
высотой тона в сегменте, как уже было показано в разделе сСпектр
чирпа• на стр. 38.
Оценим высоту тона точнее, применив автокорреляцию. Если
сигнал периодический, то пик автокорреляции придется на момент,
когда lag равен периоду.
" •• •••• 1 Гnа1а 5. А1токорреn1щн•
40
20
10
Частота (Гц)
Рис. 5 .6. С пектр сегмента вокального чирnа
0.
5
о.о
0
- .5
р= 0.99
-1.0 ..,. -'
___о_2.._
о . 2 оо . 0_ 2 ____
0 . .. ._ 4___
2 0_ 0 .�0 б___
2_ . 2_
ов
о.,,. ---о. 2 10
Время (с)
Рис. 5. 7.Два сегмента чирпа: один начинается
на 0,0023 секунды позже другого
1 .0
0 .5
"'
"
з
"'
" о .о
"'
а.
а.
о
::.::
0
- .5
-1. О
о�----
5...,_
0 ____ .._
10 0____ 5 0____
1.._ 2..._
оо___,
Lag lи ндек с)
Рис. 5.8. Автокорреляционная функция для сегмента из чирпа
Глава 5. Автокоррелsщия
r - Lixi yi
Это определение корреляции не «стандартизировано• , поэтому ero
интервал не всегда от - 1 до + 1 . Но у него другие полезные свойства.
Если рассматривать х и у как вектора, то это формула скалярного
пpoизвeдeния, x · y. Cм. http : / / en . wi kipedia . o rg/wi ki/ Dot_prod
uct (на англ. яз.)
Скалярное произведение указывает на степень похожести сигна
лов. Если они нормализованы, то их стандартные отклонения равны 1 :
x · y - cos (J
где (J - угол между векторами. И это объясняет, почему на рис. 5.2 -
косинус.
Исnоп�.эование NumPy 1111• •• &1
Использование N u m Py
NumPy дает функцию correlate, вычисляющую корреляцию двух
функций или автокорреляцию одной функции. Ее можно использо
вать для вычисления автокорреляции сегмента из предыдущего раз
дела:
corrs2 = np . correlate ( segment . ys , segmen t . ys , mode= ' s ame ' )
30
20
Lag
Рис . 5 . 9 . Автокорреляционная функция, вычисленная с np . correlate
Если сравнить рис. 5.9 с рис. 5.8, то видно, что корреляции, вы
численные с помощью np . correlate, уменьшаются с ростом lag,
Гnава 5. Автокорреn1щнн
Упражнения
Решения этих упражнений находятся в блокноте chap 0 5 soln . ipynb.
Упражнение 5. 1
Блокнот Jupyter этой главы, chap 0 5 . ipynb, содержит приложение,
в котором можно вычислить автокорреляции для различных lag.
Оцените высоты тона вокального чирпа для нескольких времен на
чала сегмента.
Упражнение 5.2
Пример кода в chap0 5 . ipynb показывает, как использовать авто
корреляцию для оценки основной частоты периодического сигнала.
Инкапсулируйте этот код в функцию, названную e s t imate_funda
mental, и используйте ее для отслеживания высоты тона записанного
звука.
Проверьте, насколько хорошо она работает, накладывая оценки вы
соты тона на спектрограмму записи.
Уn ражнени11
11111 ••&1
Упражнение 5.3
Для упражнений в предыдущей главе были нужны исторические
цены BitCoins, и надо было оценить спектр мощности изменения цен.
Используя те же данные, вычислите автокорреляции цен в платеж
ной системе Bitcoin. Быстро ли спадает автокорреляционная функ
ция? Есть ли признаки периодичности процесса?
Упражнение 5. 4
В репозитории этой книги есть блокнот jupyter под названием
saxophone . ipynb, в котором исследуются автокорреляция, воспри
ятие высоты тона и явление, называемое подавленная основная. Про
чтите этот блокнот и •погоняйте• примеры. Выберите другой сегмент
записи и вновь поработайте с примерами.
У Ви Харт (Vi Hart) есть отличное видео под названием •Так что же
там с шумами? (Наука и математика звука, частота и высота тона)•.
Она демонстрирует феномен подавленной основной и объясняет, как
воспринимается высота тона (по крайней мере, насколько об этом из
вестно). См. ht tps : / /www . youtube . com/watch ?v=i O DXxNeaQO .
----···
r11ава 6.
Д и ск ретно е ко с и нусн о е
n рео6раэова ние
С интез
Пусть даны список амплитуд и список частот, и надо создать сигнал
в виде суммы этих частотных компонент. С объектами из модуля
С инте з с массивами 11111 ••&1
thinkdsp есть простой способ выполнения этой операции, называе
мой синтезом:
de f s ynthe s i z e l ( amps , f s , t s ) :
componen t s = [ th i n kdsp . Co s S ignal ( freq, amp )
for amp , f req in z ip ( amps , f s ) ]
s ignal = t h i n kdsp . SumS igna l ( * component s )
t s = np . l i n space ( O , 1 , f ramerate )
ys = s ynthe s i a e l ( amps , f s , t s )
wave = thinkdsp . wave ( ys , f rame rate )
Синтез с массивами
Вот еще один способ записи s ynthe s i ze:
de f s ynthes i z e2 ( amp s , f s , t s ) :
args = np . outer ( t s , f s )
М = np . cos ( P I 2 * args )
ys = np . dot ( M , amp s )
return ys
[��s]
-
0.25
0. 1
0.05
л
Рис . 6. 1 . Си нтез с массивами
сумма произведений:
е = О,ба + О,25Ь + О, 1 с + O,OSd
Аналогично и с другими элементами ys. Так, каждый элемент ys
есть сумма четырех частотных компонент в некий момент времени,
Анапиэ
Анали з
Теперь решим задачу анализа. Пусть сигнал задан в виде суммы ко
синусов с неким набором частот. Как найти амплитуду каждой час
тотной компоненты? Иными словами, как, имея ys, ts и fs, восста
новить amps?
В терминах линейной алгебры первый шаг аналогичен синтезу: вы
числим М = cos (2nt @ /). Затем найдем а, при котором у - Ма; иначе -
решим линейную систему. В NumPy есть l i n a l g . s o l ve, делающая
именно это.
Вот как выглядит код:
de f ana l y z e l ( ys , f s , t s ) :
args = np . outer ( t s , f s )
М = np . cos ( P I 2 * args )
amps = np . l i n a l g . s o lve ( M , ys )
return amps
Ортогональные матрицы
Один из способов решения линейных систем - инверсия (обращение)
матрицы. Обратная квадратная матрица М записывается м- 1 , и у нее
есть свойство м- •м = 1. Здесь 1 - единичная матрица, у которой все
диагональные элементы - 1 , а остальные = О.
Таким образом, чтобы решить уравнение у = Ма, можно умножить
обе части на м- 1 • Это даст:
м- •у - м-•ма
Заменим в правой части м- •м на /:
м- •у = la
Но умножение 1 на вектор а дает а, поэтому:
м-•у = а
Значит, если эффективно вычислить м- 1 , то а найдется простым
умножением матриц (используя np . dot ) . Время работы будет про
порционально n2 , что лучше, чем n3 •
Инвертирование матриц вообще - операция медленная, но в не
которых особых случаях - быстрая. В частности, если М ортогонш�ь
ная, то матрица, обратная М, - просто транспонированная М, запи-
О ртоrон ап"н w е матр и цы 11111 ••&1
сываемая МГ. В NumPy транспонирование массива выполняется за
неизменное время. Элементы массива не перемещаются, но создается
•снимок•, изменяющий порядок доступа к элементам.
Опять же, матрица ортогональна, если ее транспонирование бу
дет вместе с тем и ее обращением, то есть МТ м- •. Значит, МТМ - -
amps это тот же вектор амплитуд, что и выше. Раз есть четыре ча
-
Заметим, что 0,707 - это приближенно .../2/2, или cos 11/4. Отметим,
что эта матрица симметрична, и элемент (j,k) всегда равен элементу
(kj). Значит, М транспонируется сама в себя, то есть МТ М. -
Д КП - IV
Но М можно сделать ортогональной при тщательном выборе ts и f s .
Для этого есть несколько способов, поэтому существует несколько
версий дискретного косинусного преобразования (ДКП).
В простейшем случае можно сдвинуть t s и f s на пол-единицы. Эта
версия называется ДКП-/V, где IV римская цифра, указывающая,
-
А МГМ станет:
[ [ 2. о. о. о.]
[ о. 2 . -о . о.]
[ о . -о . 2 . -О . ]
[ о. о . -о . 2.]]
О б ратное Д КП
Наконец заметим, что analyze2 и s ynthe s i z e 2 почти идентичны.
Вся разница в том, что в ana l y z e 2 результат делится на 2. Использу
ем это при вычислении обратного ДКП:
de f inverзe d c t iv ( amps ) :
return d ct_i v ( amps ) * 2
Кл асс Dct
thinkdsp дает класс Dct, который инкапсулирует ДКП так же, как
класс Spect rum инкапсулирует БПФ. Чтобы создать объект Dct,
можно вызвать make_dct для wave:
s i g n a l = t h i n kdsp . T r i an g l e S ignal ( f req= 4 0 0 )
wave = s i g n a l . ma ke_wave ( du r a t i o n = l . O , frame rate= 1 0 0 0 0 )
dct = wave . ma ke_dc t ( )
dct . p l o t ( )
8000
6000
r::
� 4000
2000
о
1
1 1
о 1000 2000
Частота (Гц)
3000
Рис. 6.2. DCT треугольного сигнала 400 Гц, скорость выборки 1 О кГц
4000 5000
t c l a s s wave :
de f ma ke_dct ( s e l f ) :
N = len ( s e l f . ys )
h s = s c i p y . f f tpac k . dct ( s e l f . ys , t ype=2 )
fs = ( 0 . 5 + np . a r ange ( N ) ) / 2
return Dct ( h s , f s , s e l f . f ramerate )
t class Dct
de f make_wave ( se l f ) :
n = len ( se l f . h s )
y s = s c ip y . f ftpack . i dct ( s e l f . hs , t ype= 2 ) / 2 / n
return wave ( ys , f ramerate=s e l f . f ramerate )
Уп р ажнения
Небольшой стартовый код представлен в блокноте chapO б s t a rte r .
ipynb.
Решения находятся в chapO б s o l n . ipynb.
Упражнение 6. 1
В этой главе утверждается, что ana l y z e l требует времени пропор
ционально п3, а ana l yze2 - пропорционально п 2 • Убедитесь в этом,
запуская их с несколькими разными массивами и засекая время рабо
ты. В блокнотах Jupyter можно использовать •волшебную команду•
% t1-it.
Если печатать зависимость времени работы от размера на лога
рифмической шкале, то получится прямая линия с уклоном 3 для
ana l y z e l и с уклоном 2 для ana l y z e 2 .
Также стоит поупражняться с dct_iv и scipy . f f tpac k . dct.
Упражнение 6.2
Одно из основных применений Д КП - это сжатие звука и изобра
жений. В простейшей форме ДКП при сжатии работает следующим
образом:
1. Разбивает длинный сиmал на сегменты.
2. Вычисляет ДКП каждого сегмента.
111 8 •81111 Гnааа 6. Дискретное косинусное преобразование
Упражнение 6.3
В репозитории этой книги есть блокнот jupyter под названием
pha se.ipynb, в котором исследуется влияние фазы на восприятие
звука. Прочтите этот блокнот и •погоняйте• примеры. Выберите
иной сегмент звука и повторите эксперименты. Можно ли найти не
кие общие соотношения в фазовой структуре звука и· его восприятии?
�···----
r11ава 7.
Ди скрет н о е
nре о 6р а э ова н ие Фур•е
дробных степеней.
Потенцирование можно выразить в виде степенного ряда:
еФ = 1 + ф + ф2/2! + ф3/3! + ...
Это определение верно для вещественных чисел, для мнимых чи
сел и, простым расширением, для комплексных чисел. Применив это
определение к чисто мнимому числу iф, получим:
еiФ = 1 + iф - ф2/2 ! - iф3/3! + ...
Перестановкой членов можно показать, что это эквивалентно
еiФ = cos ф + i sin ф
Вывод можно посмотреть на веб-странице h t tp :' / / ru . w i kipedia .
о r g / w i k i / Формула_Эйлера .
Предполагается, что f!Ф - это комплексное число с модулем 1 ; со
ответствующая ему точка на комплексной плоскости всегда располо
жена на единичной окружности. Если представить число как вектор,
то угол ф между вектором и положительной осью х, выраженный в ра
дианах, - это аргумент.
В случае, когда показатель степени - комплексное число, получим:
en+;; = е"f!Ф = АеiФ
Ко м плексные си г налы
Если ф(t) функция времени, l!ф(.1> - также функция времени. В част
ности:
pha s e s = P I 2 * Se l f . freq * ts + s e l f . o f f s e t
ys = se l f . amp * np . exp ( l j * phase s )
return ys
Задача синте з а
Сложные сигналы можно создавать сложением не только действи
тельных, но и комплексных синусоид с разными частотами. Это за
дача синтеза в комплексной форме: как оценить сигнал, имея частоты
и амплитуды каждой комплексной компоненты?
Простейшее решение - создать объекты Comp l e x S i n u s o i d и сло
жить их:
de f s ynthe s i z e l ( amp s , f s , t s ) :
compone n t s = [ t h i n kdsp . ComplexS i n u s o i d ( f req, amp )
for amp , freq in z i p ( amp s , f s ) ]
s i gnal = t h i n kdsp . SumS igna l ( * component s )
y s � s i gn a l .eva luate ( t s )
return ys
Результатом будет:
Задача синтеза 11111 ••&1
[ 1 . 000+0 . 000e+ O O j О . 995+9 . 0 9Зе- 0 2 j 0 . 9 7 9+ 1 . 8 0 3 e - O l j . . . ,
0 . 97 9- l . 8 0 3e-O l j О . 9 9 5 - 9 . 0 9Зе- 0 2 j l . 000-5 . 08 le-15j ]
- мн и м.
(с)
- 1 .0
.��...,
О . ООО
о----,--;�---,.�с----,--;�---,
,..,._ 0. 0 1 0 0 . 0 1 5 0 . 02 0 0-7=0--
0 . 005
,- . 0 2 5 -=-7�::::
0 . 030
�=�
:;
0.035 0 . 040
Время
Рис. 7. 1 . Действительные и мнимые части смеси
комплексных синусоид
1 Автор категорически неправ, но рассмотрение понятю1 «аналитический сиrнал• выхо
дит за рамки этой книrи. - Прим. ред.
" •• •... , Гп ава 7. Дискретное преобразование Фурье
Синте з с матрицами
В разделе «Синтез с массивами• на стр. 75 показано, как выразить
задачу синтеза в терминах перемножения матриц:
PI2 = np . p i * 2
амплитуд.
f s - это последовательность, содержащая частотные компоненты.
ts - это моменты времени, в которые оценивается сигнал.
args содержит тензорное произведение ts и f s , причем ts работа
ет вниз по строкам, а f s - вдоль столбцов (см. рис. 6. 1 ).
Каждый столбец матрицы м содержит комплексные синусоиды
с определенной частотой, обрабатываемые в моменты времени из ts.
При умножении м на амплитуды получится вектор, элементы ко
торого соотносятся с t s . Каждый элемент - это сумма нескольких
комплексных синусоид, оцененных в соответствующие моменты вре
мени.
Вот пример из предыдущего раздела:
>>> уе = eyntheeize2 (aшpe , fe , te )
>>> У•
[ 1 . 0 0 0 +0 . 0 0 0 e + O O j 0 . 9 9 5 + 9 . 0 9Зе- 0 2 j 0 . 9 7 9 + 1 . 803e- O l j . . . ,
0 . 9 7 9 - l . 8 0 3e - O l j 0 . 9 9 5 - 9 . 0 9 З е - 0 2 j 1 . 0 0 0 - 5 . 0 8 1 e - 1 5 j ]
t h i n kp l o t . p l o t ( t s [ : n ] , ys . real [ : n ] )
thinkplot . p lot ( t s [ : n ] , y s 2 . real [ : n ] )
-
l . O L_�----,-������-�----1=====1
О.ООО 0.005 0 . 010 0.015 0. 020 0 .0 2 5
Время (с)
Рис. 7 .2. Действительная часть двух комплексных сигналов,
отличающихся фазами
Гл а в а 7 . Дискретно е п реоб ра зо вание Фур ье
Задач а анализа
Задача анализа обратна задаче синтеза: имея последовательность об
разцов, у, и зная частоты, имеющиеся в сигнале, как вычислить ком
плексные амплитуды компонент?
В разделе «Анализ� на стр. 77 показано, как можно решить эту про
блему созданием матрицы синтеза М и решением системы линейных
уравнений, Ма = у, для а:
de f a n a l y z e l ( y s , f s , t s ) :
a r g s = np . o u t e r ( t s , f s )
М = np . exp ( l j * P I 2 * args )
amps = np . l i n a l g . s o lve ( M , ys )
return amp s
Эффективный анализ
К сожалению, решение системы линейных уравнений идет медлен
но. ДКП получилось ускорить таким выбором fs и t s , чтобы м стала
ортогональной. Тогда обратная м аналогична транспонированной м;
значит, и ДКП, и обратное ДКП можно вычислить перемножением
матриц.
ДП Ф
N = 4
ts = np . a range ( N ) / N
fs = np . arange ( N )
args = np . outer ( t s , f s )
м = np . exp ( l j * P I 2 * args )
так:
MstarM = M . conj ( ) . t ranspose ( ) . dot ( M )
ДПФ
Функцию ana l y z e 2 использовать неудобно, поскольку она работает
только при правильно выбранных fs и t s . Перепишем ее так, чтобы
брать только y s , а f req и собственно t s вычислять.
" •••••• 1 Гnааа 7. Дискретное n реоб раэоаание Фурье
ДПФ ре ал ьн ы х си г налов
Класс Spe c t rum в t h i n kdsp основан н а np . f t t . r f f t , вычисляющей
«действительное ДПФ»; то есть работающей с реальными сигналами.
ДПФ, представленное в настоящей главе, более общнй случай, - оно
работает с комплексными сигналами.
Что же произойдет, если «полное ДПФ» применить к реальному
сигналу? Рассмотрим пример:
s i gnal = t h i n kdsp . Sawtoot h S i gna l ( freq= 5 0 0 )
wave = s i gna l . ma ke_wave ( du r a t i o n = O . l , f ramerate= l 0 0 0 0 )
hs = dft ( wave . ys )
amps = np . abs o l u t e ( hs )
300
250
�
/:' 200
�
"'
>: .
<( 150
100
50
0
0 2000 4000 6000 8000 10000
Частота (Гц)
Упр ажнения
Решения этих упражнений находятся в блокноте chap 0 7 s o l n . ipynb.
Упражнение 7. 1
В блокноте для этой главы, chap 0 7 . ipynb, представлены дополни
тельные примеры и пояснения. Прочитайте блокнот и запустите код.
Упражнение 7.2
В этой главе показано, как выразить ДПФ и обратное ДПФ про
изведениями матриц. Время выполнения этих операций пропорци
онально №, где N - длина массива сигнала. Во многих случаях этого
достаточно, но есть алгоритм и побыстрее - быстрое преобразование
Фурье (БПФ); время его работы пропорционально N log N.
Ключ к БПФ - это лемма Дэниелсона-Ланцоша (Danielson
Lanczos):
DFT(y)(n] = DFT(e)[n] + exp( -2 rrin/N) DFT(o)[n] ,
где DFT(y )[n] - это п-й элемент ДПФ от у, е и о - массивы сигнала,
содержащие соответственно четные и нечетные элементы у.
Эта лемма предлагает рекурсивный алгоритм для ДПФ:
1. Дан массив сигнала у. Разделим его на четные элементы е и
нечетные элементы о.
2. Вычислим DFT е и о, делая рекурсивные вызовы.
3. Вычислим DFT(y ) для каждого значения п, используя лемму
Дэниелсона-Ланцоша.
В простейшем случае эту рекурсию надо продолжать, пока длина у
не дойдет до 1 . Тогда D FT(y ) = у. А если длина у достаточно мала,
можно вычислить его ДПФ перемножением матриц, используя зара
нее вычисленные матрицы.
Подсказка: реализовывать этот алгоритм стоит постепенно, начав
с нерекурсивной версии. На шаге 2, вместо того чтобы делать рекур
сивный вызов, используйте d f t , как показано в разделе •дПФ• на
стр. 93, или np . f f t . f f t . Отладьте шаг 3 и проверьте, согласуются ли
результаты с другими реализациями. Затем добавьте базовый случай
и убедитесь, что он работает. И наконец, замените шаг 2 на рекурсив
ные вызовы.
Примечание: помните, что ДПФ периодично; попробуйте приме
нить np . t i l e .
О БПФ можно прочитать подробнее в Википедии: https : / /
ru . w i k ipedi a . o rg / w i k i / Быc тpoe_пpe oбpaзoвaниe_Фypь e .
m•••----
r11ава 8.
Ф и 11ьт р а ц и • и св ертка
Сгл аж и в ание
Сглаживание - это операция, удаляющая быстрые изменения сигнала
для выявления общих особенностей. Например, график ежедневных
изменений в цене акций будет выглядеть •зашумленным•, а сглажи
вающий оператор сделает его удобным для понимания тенденции
цен - растут они с течением времени или падают.
Обычный алгоритм сглаживания называют скользящим средним -
оно дает среднее из предыдущих п значений для некоторого п.
Например, на рис. 8. 1 показаны ежедневные цены закрытия акций
Facebook с 17.05.20 1 2 по 08. 1 2.20 15. Серая линия - необработанные
данные, а темная - скользящее среднее за 30 дней. Сглаживание уда
ляет самые резкие изменения и упрощает оценку долгосрочных тен
денций.
Сглаживание применяется и к звуковым сигналам. Например,
начнем с прямоугольного сигнала 440 Гц. В разделе • Прямоугольный
сигнал• на стр. 27 показано, что гармоники прямоугольного сигнала
спадают медленно, в нем много высокочастотных компонент.
Создадим сигнал и два массива wave:
s i gnal = t h i n kdsp . S quareS igna l ( freq= 4 4 0 )
wave = s i gnal . ma ke_wave ( du r a t i on= l , framerate=4 4 1 0 0 )
segment = wave . s egmen t ( durat i on=0 . 0 1 )
" •••••• 1 Глава 8. Фиn�.траци• и свертка
100
80
�·
"' 60
х
"'
:::1
ежедневное
- среднее за 30 дней
200 4 00 600 800 1000 1 2 00
Время (д н и )
Рис. 8. 1. Ежедневные цены закрытия акций Facebook
и их скользящего среднего за 30 дней
w i ndow = np . ones ( l l )
wi ndow / = sum ( wi ndow )
Результат - снова 1 .
Остальные элементы вычислим аналогично. Ниже дана функция,
организующая приведенный выше код в цикл и сохраняющая резуль
таты в массив:
de f smooth ( ys , window ) :
N = len ( yз )
smoothed = np . zeroз ( N )
padded = t h i n kdsp . z e ro_pad ( w i ndow , N )
rolled = padded
for i i n range ( N ) :
smoothed [ i ] = з um ( ro l led * уз )
r o l l e d = np . ro l l ( ro l l e d , 1 )
return smoothed
1 .0 ....-- .- ....-- -
•
1
0.5
1
1
1
о.о 1 1
1 '
1 1
1 '
•
-0. 5
1 1
- 1 .0 - � � - �
Свертка
Выполненная выше операция - применение оконной функции к пе
рекрывающимся сегментам сигнала - и есть свертка.
Свертка - настолько распространенная операция, что NumPy дает
реализацию, которая быстрее и проще, чем версия автора:
convolved = np . convo lve ( ys , wi ndow , mode= ' va l i d ' )
smooth2 = t h i n kdsp . wave ( convolved, f ramerate=wave . f ramerate )
Ч астотная о бласть
Сглаживание делает фронты в прямоугольных сигналах менее кру
тыми, а звук - слегка приглушенным. Рассмотрим, как эта операция
влияет на спектр. Сначала напечатаем участок спектра оригинально
го сигнала:
Spect rum = wave . ma ke_Spe c t rum ( )
Spect rum . p lot ( colo r=GRAY )
2 5 000
20000
"'
g1
� 5000
с ·
"
<1:
10000
5000 1
0
1i
000
1 1
0 ���-5����--, 1 0-
00�
0---1� 5�
00�
0 --�
2�
00�
�
00
Частота (Гц)
Рис. 8 . 3 . Сп ектр прямоугольного сигнала до и после сглаживания
Теорема о с вертке
Ответ прост - это теорема о свертке. Математически говоря,
DFT(f * g) = DFT(f) DFT(g),
·
о.в
�"'
2
:1:
0.6
"'
QI
"'
:J:
�04
QI
8
u
0.2
Частота (Гц)
Рис. 8. 4 . Соотношение спектров прямоугольного сигнала
до и после с глаживания
\
С(
�
:<
"
"
>: 0 . 6
"'
"
:<
:z:
"
;!
� 0.4
оо
u
0.2 .
О О
. 0�����.._
50 0_.
О _.__._.._._
1 О_.
00-0........
.._. _._
._.. 1 5�
_. 0...
00....�
._ �-
20 О�
... О ....
О ...
Частота ( Гц)
Рис. 8 . 5 . Соотношение спектров прямоугольного сигнала
до и после сглаживания и ДПФ окна сглаживания
Гауссов ф ил ьтр
Окно скользящего среднего, изученное в предыдущем разделе, есть
фильтр НЧ, но он не очень хорош. ДП Ф сначала резко падает, а потом
заметно колеблется. Эти колебания называют боковыми лепестками,
а появляются они оттого, что окно скользящего среднего похоже на
прямоугольный сигнал и высокочастотные гармоники в его спектре
спадают пропорционально 1//, то есть медленно.
Лучше будет гауссово окно. SciPy дает функции, вычисляющие
много разных сверточных окон, в частности gau s s ian:
gau s s ian = s c ipy . s i gnal . gau s s i a n (M=l l , s td=2 )
gau s s i a n /= sum (gau s s ian )
o.2s 1---�---�----т---:=====:::::i
-п ря м оуголь
н ое
- г а уссо в о
И н декс
о.в
\ соот н оше н ие
- а мпли туд
�"
2 0.6
:о:
"'
"'
"
:i:
� 0.4
"'
�
о
о
u
\
0.2 1\
5000
l 1 '1
1 0000 15000 20000
Частота (Гц)
Рис. 8. 7. Соотношение спектров до и после гауссова
сгл аживания и ДПФ окна
Эффективная с вертка
Одна из причин важности алгоритма БПФ в том, что в сочетании с те
оремой о свертке он дает эффективный способ вычисления свертки,
кросс-корреляции и автокорреляции.
Теорема о свертке гласит:
DFT(f * g) - DFT(f) DFT(g). ·
name s = [ ' date ' , ' open ' , ' h igh ' , · � ow ' , ' c l o s e ' , ' vo l ume ' ]
df = pd . read_c sv ( ' fb . c sv ' , heade r= O , name s =name s )
y s = d f . c l o s e . va l u e s ( : : - 1 ]
Эффективная автокорреляция
В разделе •Свертка• на стр. 102 приводились определения кросс
корреляции и свертки; было показано, что они почти одинаковы, за
исключением того что в свертке окно обращено.
Теперь, когда есть эффективный алгоритм свертки, используем его
для вычисления кросс-корреляции и автокорреляции. Вычислим ав
токорреляцию цен на акции Facebook на основе данных из предыду
щего раздела:
corrs = np . corre l a t e ( c l o s e , c l o s e , mode= ' s ame ' )
n p . c onvolve
fft_convolve
3000000
!:!� 2 500000 .
"'
с:
"'
а.
а.
о
� 2000000 .
1 500000
1000000 ��-�-�-�-�--�-�-�-��
- 400 -300 - 2 0 0 - 1 00 о 100 200 300 400
Lag
Рис. 8.8. Автокорреляционные функции,
рассчитанные NumPy и f f t_aut o c o r r
Упражнения
Решения этих упражнений находятся в блокноте chap08 soln . ipynb.
Упражнение 8. 1
Блокнот для этой главы - chap0 8 . ipynb. Прочитайте его и запус-
тите код.
В нем есть интерактивный виджет, где можно экспериментировать
с параметрами гауссова окна и изучить их влияние на частоту среза.
Что случится, если при увеличении ширины гауссова окна std не
увеличивать число элементов в окне м?
Упражнение 8.2
В этой главе утверждается, что преобразование Фурье гауссовой
кривой - также гауссова кривая. Для дискретного преобразования
Фурье это сотношение приблизительно верно.
Попробуйте его на нескольких примерах. Что происходит с преоб
разованием Фурье, если меняется stct?
Упражнение 83
В упражнениях к главе 3 изучалось влияние на утечки спектра ок
на Хэмминга и некоторых других, предоставляемых NumPy. Глубже
понять эти окна можно, изучив их ДПФ.
В дополнение к Гауссову окну, использованному в этой главе, соз
дайте окно Хемминга тех же размеров. Дополните окно нулями и на
печатайте его ДПФ. Какое окно больше подходит для фильтра НЧ?
Полезно напечатать ДПФ с логарифмическим масштабом по у.
Поэкспериментируйте с разными окнами и разными размерами
этих окон.
- - - - · · · (;
r11ава 9.
Дифференцирование
и и н теrр иров а н и е
name s = [ ' da t e ' , ' open ' , ' h igh ' , ' l ow ' , ' c l o s e ' , ' volume ' ]
d f = pd . read_c sv ( ' fb . c sv ' , header= O , name s=name s )
ys = d f . c l ose . va l u e s [ : : - 1 ]
c l o s e = t h i n kdsp . wave ( ys , f rame rate= l )
spect rum = wave . make_spect rum ( )
lo' �-
--�----�-�
100
�
"'
"' 60
"
::r
40
20
0 10 0 1
о lOO 200 зоо 400 soo 600 100 воо 900 i o· ' io·
Вре мя (дн и ) Ч астота ( 1 /дни )
Рис. 9. 1 . Ежедневные цены закрытия акций Facebook
и спектр этого временного ряда
Теперь вычислим ежедневные изменения цены, используя np . di f f:
di f f = np . di f f ( ys )
change = thinkdsp . wave ( di f f , f rame rate = l )
change_spect rum = change . ma ke_spe c t rum ( )
10 2
§. 2
".
"'
"
::::! о
10'
-2
-4
-б i o · 1 �---_._,_____._,.__�
о lOO 200 зоо 400 soo боо 100 воо 900 1 0- 2 10· 1
В рем я ( дни ) Частота ( 1 /дни )
d i f f_w i ndow = np . a r r a y ( [ l . O , - 1 . 0 ) )
padded = t h i n kdsp . z e ro_pad ( d i f f_w indow , len ( c l o s e ) )
di f f_wave = t h i n kdsp . wave ( padde d , f ramerate=c l o s e . framerate )
di f f_filter = di f f_wave . ma ke_spect rum ( )
1
1 0'
! - и нтеграл 1
з.о 1 =��водная
q:
� 2.5 g"' 10 2
" "
с: с:
" "
: 2.0 "'
"
i
"'
:i: 10 1
5 . 1.s
" "
3
о
:i: :i:
u
g 1.0 8
u
10°
0.5
Дифференцирование
Окно, использованное в предыдущем разделе, есть численное при
ближение первой производной, поэтому фильтр аппроксимирует
дифференцирование.
Дифференцирование во временной области соответствует просто
му фильтру в частотной области; математика поможет с этим разо
браться.
Возьмем комплексную синусоиду с частотой /:
Ef t) = е2тf1.
Первая производная от Е1 будет:
d/dt (Ef t)) - 2тri/ е2тf1,
что можно переписать следующим образом:
•
В этом случае скаляр Л есть собственное значение, соответст
вующее собственной функции g.
•
Данный оператор может иметь много собственных функций,
каждая со своим собственным значением.
Поскольку комплексные синусоиды - собственные функции опе
ратора дифференцирования, они легко дифференцируемы. Достаточ
но лишь умножения на комплексный скаляр.
Для сигналов со многими компонентами процесс ненамного слож
нее:
1. Выразите сигнал совокупностью комплексных синусоид.
2. Вычислите производную каждой компоненты умножением.
3. Сложите продифференцированные компоненты.
Этот алгоритм очень похож на алгоритм свертки в разделе •Эффек
тивная свертка• на стр. 1 08: вычислить ДПФ, умножить на фильтр
и вычислить обратное ДПФ.
Spe c t rum дает метод, накладывающий дифференцирующий фильтр.
t c l a s s Spect rum :
de f di f fe r e n t i a t e ( s e l f ) :
s e l f . h s * = P I 2 * l j * s e l f . fs
� - 10
�
"
�
"
20
-
"
:r
..,
:s:: - 3
0
- 40
- 5 00 1
0 20 30 40 50
Время (дни)
Рис . 9 . 4 .
С рав н е н ие ежедн евных изме н е н ий це н , рассчитанных
с np.diff и с применением дифференцирующего фильтра
1 c l a s s Spect rum :
de f i n tegrate ( s e l f ) :
se l f . h s /= P I 2 * lj * s e l f . fs
80
60
�
"' 40
:i:
"
::::I
20
-20
-40 '---"'--"-'-����-'
о 100 200 300 400 500 600 700 800 900
В ремя (дни )
Рис. 9 . 5 . С равнение оригинального временного ряда
и проинтегрированной производной
Н арасrающа11 сумма
11111 ••1111
Если эту •постоянную интегрирования• добавить, то результаты
будут идентичны, и именно поэтому интегрирующий фильтр обратен
дифференцирующему.
1 4 00
0.5 1 2 00
1000
о.о 800
600
-0.5 400
200
0 --�
\._
- 1 8. 0 о-�
'=-= �
о
2 ---:
. о=-
о� .0
'""' о .7
4--о- об о�
,-----, . о..,. о . 1· 0 ° oL...:::1!1•"
5 o---1""
oo 0�"'
00 0--1 5�
""' ,.
00 ..,
0- 2 0-
-,..., 00 0...J
'"'
150
100
150000
50
100000
50000
- 50
0
- 1 8.00 0 .02 0 . 04 О.Об 0 .08 0.10 °о 5000 10000 15000 20000
ф ильтр c u m s u m ·
- интегратор
1 02
1
10
�----�----�-�
1
10·
о 5000 1 0000 15000 2 0000
0
1 3 ,---�---��----;::====:::;-i
ф ильтр c u m s u m
. отношение
0
1 2
с(
�
"'
�
>:
"'
"
"' 0 ·.
:r 1 1
"
3
о·
о
:r
о
u
0
1 °
10·' o�---s--'
0� ____--'
00 0 o-0_
0 s o-
___--' o-
o ---
20 o_
_.. oo
---'
1 1
Ча стота (Г ц) 1
И нтегрирование шу м а
В примере из раздела •Броуновский шум>) на стр. 52 броуновский
шум был получен вычислением нарастающей суммы белого шума. Те
перь, изучив влияние cums um в частотной области, проще разобраться
со спектром броуновского шума.
В среднем у белого шума одинаковая мощность на всех частотах.
При вычислении нарастающей суммы амплитуда каждого компонен
та делится на /. Поскольку мощность - это квадрат амплитуды, мощ
ность каждого компонента делится наf. Так что в среднем мощность
на частоте / пропорциональна 1 /f:
Р1 = К / f,
где К - несущественная константа. Логарифмируем обе части:
log Р1 = log К - 2 logf.
Значит, при выводе участка спектра броуновского шума в двой
ном логарифмическом масштабе получится прямая линия с уклоном,
близким к -2.
В разделе • Конечные разности>) на стр. 1 1 2 строился спектр цен
закрытия на акции Facebook, и оценка наклона была близка к - 1 ,9,
Упражнени•
1111• ••Е1
что согласуется с броуновским шумом. У цен на многие акции анало
гичные спектры.
При использовании оператора di f f для расчета ежедневных изме
нений амплитуда каждого компонента умножалась на фильтр, про
порциональный/; значит, мощность каждого компонента умножалась
наf. На двойной логарифмической шкале эта операция прибавляет 2
к уклону спектра мощности, поэтому предполагаемый уклон резуль
тата близок к О, 1 (чуть меньше, ведь di f f аппроксимирует дифферен
цирование).
Упражнения
Решения этих упражнений находятся в блокноте chap0 9soln . ipynb.
Упражнение 9. 1
Блокнот для этой главы - chapO 9 . ipynb. Прочитайте его и запус
тите код.
В разделе •Нарастающая сумма• на стр. 1 19 отмечено, что некото
рые примеры не работают с апериодическими сигналами. Замените
периодическ�й пилообразный сигнал на непериодические данные
Facebook и посмотрите, что пойдет не так.
Упражнение 9.2
Вэтомупражнении изучается влияние di f f и di f fеrеnt iаtе насиг
нал. Создайте треугольный сигнал и напечатайте его. Примените di f f
к сигналу и напечатайте результат. Вычислите спектр треугольного
сигнала, примените di f ferentiate и напечатайте результат. Преоб
разуйте спектр обратно в сигнал и напечатайте его. Есть ли различия
в воздействии di f f и di f ferentiate на этот сигнал?
Упражнение 9.3
В данном упражнении изучается влияние cumsum и integrate на
сигнал. Создайте прямоугольный сигнал и напечатайте его. Приме
ните cumsum и напечатайте результат. Вычислите спектр прямоуголь
ного сигнала, примените integrate и напечатайте результат. Преоб
разуйте спектр обратно в сигнал и напечатайте его. Есть ли различия
в воздействии cumsum и integrate на этот сигнал?
Упражнение 9. 4
В данном упражнении изучается влияние двойного интегрирова
ния. Создайте пилообразный сигнал, вычислите его спектр, а затем
дважды примените integrate. Напечатайте результирующий сигнал
Гл а в а 9 . Ди фф еренцнро аонне н ннтеrрнроаанне
r11а ва 1 0 •
Си г налы и си стемы
В контексте обработки сигналов система это абстрактное представ
-
стыми свойствами:
1. Линейность.
Е сли на вход системы подать два воздействия, то на выходе бу
дет сумма результатов этих воздействий. Математически, если
на входе х1 , то на выходе у 1 , если х2, то у2, причем ах1 + Ьх2 на
входе дадут ау 1 + Ьу2 на выходе, где а и Ь скаляры.
-
2. Неизменность во времени
Свойства системы неизменны во времени и не зависят от со
стояния системы. Так что если воздействия х1 и х2 отличают
ся только временным сдвигом, то появляющиеся на выходе
у 1 и у2 отличаются только этим сдвигом, а в остальном иден
тичны.
Свойства многих физических систем таковы хотя бы в первом при
ближении:
• схемы, содержащие только сопротивления, емкости и индук
тивности, - Л С-системы, с точностью до соответствия компо
нентов своим идеализированным моделям;
•
механизмы, содержащие пружины, массы и демпферы ( амор
тизаторы), - также ЛС-системы, если пружины (сила пропор
циональна смещению) и демпферы (сила пропорциональна
скорости) - линейные;
• среды, передающие звук (включая воздух, воду и твердые
тела), хорошо моделируются как ЛС-системы. И для нас это
самое важное.
Описываются ЛС-системы линейными дифференциальными
уравнениями, причем решениями этих уравнений будут комплекс
ные синусоиды (см. статью в Википедии h t tp : / / en . wi kipedia .
o r g / w i ki / L i n e a r_di f fe r en t i a l_equa t i on на англ. яз.).
Теперь можно составить алгоритм вычисления воздействия ЛС
систем на входной сигнал:
1. Выразить входной сигнал суммой комплексных синусоид.
2. Вычислить соответствующий выходной компонент для каж
дого входного.
3. Сложить выходные компоненты.
Этот алгоритм уже хорошо знаком. Он использовался для свертки
(см. раздел •Эффективная свертка», стр. 108 ) и для дифференциро
вания (см. раздел •дифференцирование», стр. 1 1 5). Этот процесс на
зывается разложение в спектр, поскольку входной сигнал •раслады
вается» на спектральные компоненты.
Для применения этого процесса к ЛС-системе ее надо охаракте
ризовать, определив ее воздействие на каждый компонент входно
го сигнала. Так, для механических систем это легко и просто: надо
•пнуть» систему и записать выходные данные.
Технически говоря, •пинок» - это импульс, а выход системы - им
пульсная характеристика. Удивительно, но одним импульсом можно
О кна и ф ильтры 11111 ••1111
охарактеризовать систему целиком. Для начала вычислим ДПФ им
пульса. Вот массив сигнала с импульсом при t = О:
impu l s e = np . zeros ( 8 )
impu l s e [ O ] = 1
impu l s e_spe ct rum = np . f ft . f ft ( impu l s e )
О кна и ф ильт р ы
Подтвердить, что вышеописанное изучение системы верно, можно
на простом примере: двухэлементное скользящее среднее. Эта опера
ция - по сути, система, принимающая сигнал в виде входных данных
и выдающая на выходе слегка сглаженный сигнал.
В этом примере окно известно, и можно вычислить соответствую
щий фильтр. В реальности часто все не так; в следующем разделе мы
рассмотрим пример, где ни об окне, ни о фильтре заранее ничего не
известно.
Вот окно для вычисления двухэлементного скользящего среднего
(см. раздел •Сглаживание• на стр. 99):
wi ndow_array = np . array ( [ 0 . 5 , 0 . 5 , О , О , О , О , О , 0, ) )
wi ndow = thin kdsp . wave ( window_a r r a y , f ramerate= B )
Ч астота
Рис . 1 О . 1 . ДПФ двухэлементного скользящего среднего
200
0.5
"' 150
о.о
�"
"
с:
>:
<( 100
-0.5
0.5
о.о
-0.5
0.5
о.о
-0.5
Системы и свертка
Предыдущий пример - вовсе не черная магия, хотя автору до сих пор
немного не по себе.
В предыдущем разделе предложено объяснение достигнутого эф
фекта:
• импульс состоит из компонент с амплитудой 1 на всех частотах;
•
импульсная характеристика содержит сумму откликов систе
мьl 'на все эти компоненты;
• передаточная функция, или ДПФ импульсной характеристи
ки, отражает воздействие системы на каждую частотную ком
поненту в виде амплитуды и фазы;
•
для любого сигнала на входе отклик системы можно опреде
лить, разбив входные данные на компоненты: вычислить от
клик на каждую компоненту и суммировать их.
Если этого мало, то есть еще один способ: свертка! Согласно теоре
ме о свертке, умножение в частотной области соответствует свертке
во временной области. В этом примере выход системы есть свертка
входа и отклика системы.
Вот ключ к пониманию того, почему это сработает:
•
выборки входного сигнала, по сути, - это последовательность
импульсов различной амплитуды;
• каждый входной импульс •порождает• копию импульсной ха
рактеристики, соответствующую времени его появления (по
скольку система стационарна во времени) и его амплитуде;
Н а выходе будет сумма сдвинутых во времени и масштабирован
ных копий импульсной характеристики. Копии складываются, по
скольку система линейная.
Глава 1 О. Линейнwе с:тационарнwе сис:темw
В ре мя (с)
Рис. 1 0.4. Сумма сигнала и его сдвинуто й , масштаб ированной копии
(f * g)[n] = L, Лn - m] g[m].
т
Теперь видно, что первый член - это е., а сумма - это G[k] (исполь
зуя т как индекс времени). Теперь можно записать:
компоненты с частотой k.
Каждая входная компонента есть комплексная экспонента с ам
плитудой .F{k], поэтому каждая выходная компонента есть комплекс
ная экспонента с величиной flk) G[k) , согласно первой части доказа
тельства.
Поскольку система линейная, на выходе просто сумма выходных
компонент:
(/ * g )[n] = L, F[kJG[k]e* [n ).
k
Упражнения
Решения этих упражнений находятся в блокноте chap l O soln . ipynb.
Упражнение 10. 1
В разделе •Системы и свертка• на стр. 1 3 1 свертка описана как
сумма сдвинутых и масштабированных копий сигнала.
А в разделе •Акустическая характеристика�> на стр. 1 28 умноже
ние ДПФ сигнала на передаточную функцию соответствует круговой
свертке, но в предположении периодичности сигнала. В результате
можно заметить, что на выходе, в начале фрагмента, слышна лишняя
нота, •затекшая1> из конца этого фрагмента.
К счастью, есть стандартное решение этой проблемы. Если перед
вычислением ДПФ добавить достаточно нулей в конец сигнала, эф
фекта •заворота1> можно избежать.
Уп ражненн1
r11ава 1 1.
МОАУ• • qи• и вы6орка
( кв а н това н и е )
1.0
0.5
С вертка
о.о 1.0
-0.5 0.5
1.0
о.о
0.8
0.6 -0.5
о.о 0.5 1.0 1.5 2.0 2.5
0.4 Время (с)
0.2
о . о .___.____.___..__.__....___.____,
._
о.о 0.2 0.4 0.6 0.8 1 . 0 1 . 2 1.4
Время (с)
Ам плитуд н а я модуляция
Амплитудная модуляция (АМ) применяется в радиовещании (ДВ,
СВ, КВ) и в других областях. В передатчике косинусоидальный сиг
нал, называемый •несущая•, •модулируется• умножением на по-
Гnава 1 1 . Модуnнцин и выборка (кваитование)
А вот несущая:
c a r r i e r_s ig = t h i n kdsp . Co s S ignal ( f req= l O O O O )
c a r r i e r_wave = c a r r i e r_s ig . ma ke_wave ( du r a t i on=wave . du r a t i o n ,
frame rate=wave . f ramerate )
1000
800
600
400
200
O "'-"-�....,...._.;...:;zz--.....__
.. ______=-:z:.......
. ::::шt811
...; ...-�..-..1
1 2 0 0 ������
1000
800
600
400
200
o ��....--
.. ��--�.d;��.._�O&!>--�...-.�--""""��
1200 ������
1000
800
600
400
200
В ыбор ка
Амплитудная модуляция пока показана узко - только самые осно
вы, но этого достаточно, чтобы разобраться с выборками. Выборка -
1 2 0 0 ������
1000
800 1
600
400
200
0
- 2 0000 - 1 0000 о 10000 20000
Частота (Гц)
Рис. 1 1 .3. Спектр сигнала до и после выборки
( вверху и внизу соответственно)
" • ••••• 1 Глава 1 1 . Модуn11ци11 и выборка (квантование)
о.в
0.6
0. 4
0.2
о . о ��...._��_.__�__.___._���
о.о 0.2 0.4 0.6 0.8 1.0 - 2 0000 - 10000 о 10000 20000
1.0
о.в
О.б
0.4
0.2
о . о �-.....____-�-�---'----��
о.о 0.2 0.4 0.6 о.в 1.0 - 2 00 0 0 - 10000 о 10000 20000
Вре мя (мс) Частота (Гц) 1
Б ие н ия
В разделе •Амплитудная модуляция• на стр. 139 после демодуляции
АМ сигнала дополнительные копии спектра убирались при помощи
фильтра НЧ. То же самое можно сделать после взятия выборок, но это
не лучшее решение.
На рис. 1 1 .5 показано, почему. Верхняя часть - спектр сигнала соло
на барабане. В нем есть высокочастотные компоненты, превышающие
1 О кГц. При взятии выборок из этого сигнала его спектр сворачивает
ся с пачкой импульсов (вторая часть) и появляются копии спектра
(третья часть). В нижней части показан результат после применения
фильтра НЧ со срезом на частоте заворота, 55 1 2 Гц.
Шl•••lll� Гnава 1 1 . Модуn1щия и выборка (квантование)
4000 -
3000
2000
1 000
70000 .---т-����--,���-.-���.,....,
60000
50000
40000
30000
2 0000
1 0000
о ,__.._����....�
... ����������....,__�
... ���....._.
1 2 0 0 ,.---.-����--,���-.-���.,....,
1000
800
600
400
200
о �������������������
1 2 0 0 ,.---.-����--,���-.-���.,....,
1000
800
600
400
200
5000 1- спектр
4000
3000
2000
1000
1600
1400
1 спектр п ос ле
вы бо рки
1
_
1200
1000
800
600
400
200 �
о
lбОО Г-.---����-т-����-,..-����----.--;::========z::::;-�
1 спектр п ос ле !
1
_
1400 ф ильтра
1200
1000
800
600
400
200
о �������
- 20000 - 1 00 0 0 о 10000 2 0000
Частота (Гц)
И нте рполяция
Фильтр НЧ, использованный на последнем шаге - это прямоуголь
ный фильтр (brick wall - �кирпичная стена•); все, что выше частоты
среза, будет удалено полностью, как при разделе кирпичной стеной.
В правой части рис. 1 1 .7 показано, что это за фильтр. Конечно,
умножение на этот фильтр в частотной области соответствует свертке
с окном во временной области. Выясним, что это за окно, вычислив
обратное ДПФ фильтра - оно показано в левой части рис. 1 1-.7.
0 . 3 0 ,.-----�--�-�---.
1.0
0.25
0.20 0.8
0. 1 5 .
0.6
0.10
0.05 0.4
0.2
-0
· \0000 1 . 002 1.00 4 1 .ооб 1 . 008 1.010 ° · 0. 2 0000
-
10000 о 10000 20000
Bpe��jc) Ч !!.�!�та_ ( Гцl .
sinc(x) = sinnx / пх
При применении фильтра НЧ сигнал сворачивается с sinс
функцией. Такую свертку можно понимать как сумму смещенных,
масштабированных копий sinс-функции.
В нуле sinc равен 1, а при каждом целом х он равен О. При сдвиге
sinс-функции сдвигается точка нуля. При масштабировании sinc из
меняется его размах в нуле. Поэтому при суммировании смещенных
масштабированных копий они интерполируют между точками вы
борки.
На рис. 1 1 .8 показано, как это работает на коротком сегменте соло
на бас-гитаре. В верхней части - оригинальный сигнал. Вертикаль
ные серые линии - точки выборок. Тонкие кривые - это смещенные,
масштабированные копии sinс-функции. Сумма этих sinс-функций
идентична оригинальному сигналу.
0.15
0.10
0 . 05
o.oai--�--------....--""!'1--"'!"'I•
-0.05
И тог
Поздравляем! Вот и конец книги (не считая еще нескольких упраж
нений, приведенных ниже). Прежде чем закрыть книгу, посмотрим,
что осталось позади:
•
изучены периодические сигналы и их спектры, представле
ны ключевые объекты в библиотеке t h i n kdsp: s i gnal, wave
И Spect rum;
• рассмотрена гармоническая структура простых сигналов и за
писей музыкальных инструментов, исследован эффект бие
ний;
• с помощью спектрограмм исследованы чирпы и другие звуки
с изменяющимися во времени спектрами;
• сгенерированы и проанализированы шумовые сигналы, оха
рактеризованы природные источники шума;
•
использована автокорреляционная функция для оценки высо
ты тона и дополнительной оценки шума;
• рассмотрено дискретное косинусное преобразование (ДКП),
полезное для сжатия, а также для понимания дискретного пре
образования Фурье (ДПФ);
Упрожненн•
Уп р аж нения
Решения этих упражнений находятся в блокноте chap l l s o l n . ipynb.
Упражнение 1 1. 1
Код для этой главы содержится в блокноте chap l 1 . ipynb. Изучите
его и прослушайте примеры.
Упражнение 1 1.2
Крис • Монти• Монтгомери (Chris "Monty" Montgomery) сде
лал отличное видео под названием •D/A and A/D 1 Digital Show and
Tell•. Он демонстрирует теорему о выборках в действии, и пред
ставляет множество другой замечательной информации о выборках.
См. видеоролик https : / / www . youtube . com/watch ?v=c I Q 9 I X S U z uM.
1Ш• • 11111 Глава 1 1. М одуп11ци11 и вы б орка (квантование)
Упражнение 1 1.З
Выше показано, что при взятии выборок из сигнала при слишком
низкой частоте кадров составляющие, большие частоты заворота
дадут биения . В таком случае эти компоненты не отфильтруешь, по
скольку они неотличимы от более низких частот.
Полезно отфильтровать эти частоты до выборки ; фильтр Н Ч , ис
пользуемый для этой цели, называется фильтр сглаживания.
Вернитесь к примеру � с оло на барабане•, примените фильтр НЧ
до выборки, а затем, опять же с помощью фильтра Н Ч , удалите спек
тральные копии, вызванные выборкой . Результат должен быть иден
тичен отфильтрованному сигналу.
��1 • • · " - - -
П р едметн ы й укааате11 •
А Высота тона 1 5
Автокорреляционная функция 69
восприятие 73
отслеживание 72
Автокорреляция 65, 1 09
оценка 67
периодических сиrналов 66
Выстрел 1 28
Акустическая характеристика 1 28
Выход 1 25
Алгоритм Voss McCartney 60
АМ. См. Амми1)'дная модуляция
АммИ1)'да 1 6, 24 г
коммексная 90 Гамма-Функция 86
АммИ1)'дная модуляция 1 39 Гармоники 1 7, 26, 34, 97
Анализ 74, 75, 92 Гармоническая структура 27
Аналого-цифровой преобразователь Гауссово окно 1 1 1
(АЦП) 1 42 Гауссов
Апериодический сиrнал 1 23 фильтр 1 06
Аргумент 32 шум 50, 57
Аудиовиджет 2 1 Герц (Гц) , единица частоты 1 5
АЦП С м . Аналого-цифровой
. Гласный звук 47
преобразователь Глиссандо 46
Б д
Белый шум 52, 1 1 3, 1 27 Двойной логарифмический масштаб
Биения 3 1 , 97 1 52
, 53, 1 22
Боккерини 1 5 Действительное
Боковые лепестки 1 06 БПФ 31
БПФ. См. Быстрое преобразование дискретное преобразование Фурье 96
Фурье Декартова система координат 32
Броуновский шум 50, 52, 64, 1 1 3, 1 22 Демодуляция 1 40
Быстрое преобразование Фурье Дискретное
1 6 , 3 1 , 98, 1 08 косинусное преобразование 74, 82
ДКП-IV 80
в обратное 8 1
Вектор 79 сжатие 83
Вилка {fork) 9 преобразование Фурье
Вир1)'альная машина 1 1 1 6, 25, 74, 85, 94, 1 35
Восприятие высоты тона 73 действительное 96
Временная область 1 05, 1 1 2 обратное 94
Вход 1 25 периодичность 95
Выборка 1 8, 29, 1 33, 1 38, 1 42 полное 96
П редметны й ука затель
Дифференцирование 1 1 5, 1 23 Координаты
ДКП. См. Дискретное косинусное декартова система 32
преобразование полярные 32
Доминирующая частота 1 7 Корреляция 56, 6 1 , 96
Дополнение нулями 1 01 , 1 09, 1 36 автокорреляция 65, 1 09
ДПФ. См. Дискретное преобразование периодических сигналов 66
Фурье коэффициент корреляции Пирсона 70
кросс-корреляция 1 02, 1 09
Е Пирсона 61
последовательная 64
Единичная матрица 78
стандартизирование 72
Корреспондент 1 2
3 Косинус 1 8
Зависимость дальнего действия 66 Котельников Владимир 1 50
Звук 1 4 Коэффициент корреляции Пирсона 70
Красный шум 54
и Кратковременное преобразование Фурье
Изменение размаха 22 (КВПФ) 39
Импульс 1 26, 1 3 1 , 1 33, 1 38, 1 40 Кросс-корреляция 1 02, 1 09
пачка 1 44 Круговая свертка 1 03, 1 36
Импульсная характеристика 1 26, 1 29, 1 31
Интеграл 37 л
Интегральный спектр 5 1 Лемма Дэниелсона-Ланцоша 9/t
Интегрирование 1 1 7, 1 1 9 Линейная
двойное 1 23 алгебра 76, 77
Интервал 37 система 1 25
Интерполяция 1 48, 1 49 стационарная система 1 25
Линейные дифференциальные уравнения
к 1 26
Кадр 1 8 ЛС-система. См. Линейная стационарная
система
Камертон 1 5
Квадратная матрица 77, 78
Квинта 1 7 м
КВПФ 39. См. Кратковременное Массив прореженный 84
преобразование Фурье Масштабирование 1 3 1 , 1 36, 1 39
Кпонирование 1 0 Матрица 76
Комплексная единичная 78
аммитуда 90 квадратная 77
москость 86 корреляции 62
синусоида 87, 1 1 5, 1 1 6 обратная квадратная 78
экспонента 85, 1 34 обращение 78
Комплексное число 32, 87, 90 ортогональная 78, 92
Комплексно-сопряженное 93 перемножение 90, 92
Комплексный симметричная 79
сигнал 89 транспонирование 93
экспоненциальный сигнал 87 унитарная 93
Конечная разность 1 1 2, 1 1 4 Метод Бартлеnа 59
П редметны й ук затеn�.
А G
abs 87 Gn 9
al iasi ng 31 GitНub 9
Апасопdа 1 0
aпgle 87
aplay, проигрыватель 20
iпtegrate 1 23
в
J
Binder 1 1 Jupyter, блокнот 1 0, 2 1
Bitcoiп, платежная система 59, 72
L
с
lag 64, 65
ComplexSiпusoid 87
logspace 38
CosSignal 1 8
cublcsignal, сиrнал 1 24
cumsum 37, 1 23 м
Мatplodib 1 о
D modf 26
Dct 82
diff 1 23 N
NaN 1 1 8
F пbviewer 1 1
NumPy 1 0, 70, 1 02
fft 31
Freesound 1 2, 59, 66
Ш1•• •111� П редметны й укаэатеn ь
р stretch 24
SumSignal 1 8
Padding, дополнение нулями 1 01
Pandas 1 08, 1 1 2
Python 2 1 0
т
Python 3 1 0 transpose 93
s u
SawtoothChirp, класс 46 UG-шум 50, 57
scipy 82 unblas 26
SciPy 1 0 UР-шум 60
signal, класс 1 8 , 22 UU-шум 48, 64
sinс-Функция 1 48
SinSignal 1 8 w
Sinusoid, класс 1 8 , 22 wave 2 1
Son Munnur, сайт 59 wavefonn 1 6
spectrogram 59 wave, объект 1 8
Spectrum 20 WАV-Файл 20, 1 42
с� • • • - - - -
06 а втор е
Аллен Б. Дауни (Allen В. Downey) профессор компьютерных наук
-
06 о6nожке
Животное на обложке Тhink DSP - гладкоклювый ан и ( Crotophaga
ani), большая птица семейства кукушковых. Она распространена во
Флориде, на Багамских и Карибских островах и в некоторых районах
Центральной и Южной Америки.
У гладкоклювого ани черное оперение, длинный хвост и большой
клюв с ребрами. Питаются эти птицы на земле, поедая термитов, на
секомых и даже н ебольших ящериц или лягушек. Предпочитают по
луоткрытые места, где поля соседствуют с зарослями. Рост городов
и вырубка лесов повлияли на ареал распространения ани, но птицы
приспособились к пастбищам при фермах и поедают насекомых и па
разитов, обирая их с шерсти скота.
Этот вид очень социален и всегда живет шумными стаями. В брач
ный период несколько пар гнездятся совместно, поочередно строя
чашеобразное гнездо высоко на дереве. Так же по очереди они выси
живают яйца и кормят птенцов. Каждая самка откладывает 4-7 яиц;
встречались гнезда, в которых насчитывалось до 29 яиц.
Многие из животных на обложках книг O'Reilly находятся под
угрозой исчезновения; сохранение этих видов чрезвычайно важно
для нашей планеты. Е сли вы хотите узнать, как можно им помочь,
посетите сайт anima l s . o r e i l l y . с от.
Изображение на обложке предоставлено Braukhaus Lexi.con.
Книги издательства •дМК Пресс• можно заказать в торгово-издательском
холдинге •Планета Альянс• наложенным платежом, выслав открытку или
письмо по почтовому адресу: 1 15487, r. Москва, 2-й Наrатинский пр-д, д. 6А.
При оформлении заказа следует указать адрес (полностью), по которому
должны быть высланы книги; фамилию, имя и отчество получателя. Жела
тельно также указать свой телефон и электронный адрес.
Эти книги вы можете заказать и в интернет-магазине: www.alians-kniga.ru.
Оптовые закупки: тел. +7 (499) 782-38-89.
Электронный адрес: Ьooks@alians-kniga.ru.
Аллен Б. Дауни
Тhink DSP
Цифровая обработка сигналов на Python