Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Красавин Компютерныы практикум в среде МатЛаб 2015

.pdf
Скачиваний:
121
Добавлен:
12.11.2022
Размер:
9.22 Mб
Скачать

Рис. 18.1. Случайные числа, сгенерированные алгоритмом Метрополиса и имеющие гауссово распределение

Рис. 18.2. Гистограмма случайных чисел из рис. 18.1 и огибающая

1/

√10π

211

Задания

18.1.Вычислить автокорреляционную функцию для случайных чисел из примера 18.1. Определить значение , при котором случайные числа можно считать независимыми.

18.2.Исследовать зависимость числа успешных изменений конфигурации (под успешным изменением конфигурации

понимается ситуация, когда

) от δ.

18.3. При помощи алгоритма Метрополиса сгенерировать последовательность случайных величин, имеющих нормальное распределение, выделить из этой последовательности подпоследовательность независимых случайных величин, и использовать эту подпоследовательность для расчета интегралов:

;

.

212

19

Фурье-преобразование

Рассмотрим периодическую функцию с периодом 1, определенную на всей действительной оси, и разложим ее в ряд Фурье:

,

где – целое, при этом для сходимости потребуем

 

 

 

∞.

 

 

 

 

 

Выберем на оси

дискретную пространственную сетку

 

 

,

где

фиксировано, целое. Число

называется

частотой

 

/

 

дискретизации.

Положим

значения функции в узлах

сетки.

Тогда в

фурье-разложении

функции

будет

много

слагаемых с одинаковыми экспоненциальными множителями.

Действительно,

пусть есть два

таких импульса

и

, что

,

– целое. Тогда

 

 

 

также

 

 

 

целое. Таким

образом,

. Ряд

Фурье

можно

переписать следующим образом:

,

 

,

где

– целое. Это преобразование

справедливо только для

переменной , принадлежащей дискретной сетке .

213

Таким образом, теперь задача рассматривается только на одном

периоде, разделенном

на отрезки ("узлы") длиной

. Для

решения задачи нужно

определить коэффициенты Фурье2π/.

 

Введем скалярное произведение двух функций на дискретной сетке:

1 , .

Множитель 1/ введен для корректного перехода в непрерывный предел:

 

,

|

|

 

 

.

 

Покажем,

что функции

 

 

 

при

 

 

образуют

ортонормированную систему. Вычислим

скалярное произведение

 

0

 

 

 

,

 

1

 

 

 

.

 

 

 

 

 

 

 

 

Если

, то

,

 

 

 

/

 

0; если

, то

 

 

 

 

вычислить скалярное произведение можно двумя способами:

а)

,

 

/

|

 

 

/

|

1;

 

 

 

 

б)

,

 

1

1.

 

 

 

 

δ ,0

,

, т.е.

 

 

 

 

 

Таким

образом,

доказано,

что

 

функции

 

ортонормированы,

.

 

214

Далее получим искомые коэффициенты Фурье

. Для этого

найдем

скалярное произведение

функций

и

и получим

коэффициенты через обратное преобразование Фурье:

 

,

1

,

 

1

.

 

Итак,

 

1

δ

 

,

 

 

.

 

 

 

 

 

Если коэффициенты быстро спадают с ростом номера , то

.

Для численного расчета всех коэффициентов Фурье в общем случае необходимо ~ операций, и при достаточно большом процедура расчета коэффициентов может занимать значительное время. Существует алгоритм, который позволяет проводить разложение в ряд Фурье гораздо быстрее – за ~ log операций – так называемое быстрое преобразование Фурье.

Пусть имеются коэффициенты Фурье некоторой периодической функции :

 

100,

,

1

.

,и

 

Разобьем число

на два

сомножителя:

 

 

20,

215

5

можно

(например,

 

 

 

). Тогда числа

1

представить

в

виде

,

 

 

 

 

 

 

 

 

 

 

, причем

0

,

; 0

,

 

 

 

. Формально подставим в выражение

 

 

 

 

 

 

 

 

 

 

 

 

для коэффициентов Фурье эти разложения:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Преобразуем выражение в степени экспоненты:

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заметим, что произведение

 

 

 

– целое, т.е.

. Тогда

имеем:

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введем

 

1

 

 

 

 

1

1

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тогда фурье-компоненту можно переписать так:

1

, .

216

Задача разбилась на две части: сначала определяют коэффициенты , а затем подставляют их в выражение для коэффициентов Фурье .

Определим количество операций, необходимое на расчет фурьекомпонент. Легко оценить, что для расчета всех коэффициентов

 

необходимо перебрать переменную для внутренней суммы

(т.е.

операций), а внешние переменные – это ( операций) и

( операций). Таким образом, для расчета всех коэффициентов

необходимо

 

 

операций.

Аналогично

определяем, что при

известных коэффициентах

количество

~

 

 

, равно

операций, необходимое

для расчета

коэффициентов

~операций. В общем случае при разбиении числа

на

произвольные

сомножители

цена

фурье-операций

 

будет

~

,

где

число сомножителей.

Наиболее эффективное

 

 

разбиение

достигается

при

 

 

 

 

 

 

, т.е. по

основанию 2, как в двоичном коде. В этом случае

имеем

 

,

 

2

2 .

т.е.

 

log

 

. Отсюда полное число операций

~

 

log

 

 

 

 

 

 

 

 

 

 

Запишем алгоритм специально для двоичного разбиения, часто

используемого на практике. Представим числа

 

и

 

в виде

 

 

 

 

 

 

 

2

,

 

2

;

 

,

 

 

0,1.

 

Тогда

 

для

расчета

коэффициентов

 

 

 

 

существует

последовательность рекуррентных соотношений:

 

 

 

 

 

 

 

1

 

 

 

,…, ,

,…,

,…,

 

 

,

,…,

;

 

 

2

 

 

,…,

 

 

 

 

 

 

 

 

 

217

 

;

 

 

1,…, .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заметим, что

следует сразу брать число разбиений

кратное

степеням 2:

2 .

 

В MatLab быстрое преобразование Фурье реализуется при помощи функции fft. В примере 19.1 рассмотрено использование этой функции для восстановления зашумленного сигнала

(рис. 19.1).

Пример 19.1.

Fs = 100000; % Частота дискретизации

T = 1/Fs; % Дискретизация по времени

L = 10000; % Длина сигнала

t= (0:L-1)*T; % Вектор времени

%Сумма двух синусоид 500 и 1200 Гц

x= 0.7*sin(2*pi*500*t) + sin(2*pi*1200*t);

figure

% посторение графика зависимости амплитуды чистого сигнала от времени

subplot(2,2,1)

plot(Fs*t(1:1000),x(1:1000))

title('Исходный сигнал (2 синусоиды 500 и 1200 Гц)') xlabel('Время, мс')

y = x + 2*randn(size(t));

% добавление шума к сигналу

% построение графика зависимости амплитуды зашумленного сигнала от времени

subplot(2,2,2)

plot(Fs*t(1:1000),y(1:1000)) title('Сигнал с шумом') xlabel('Время, мс')

Y = fft(y); % быстрое фурье-преобразование зашумленного сигнала f = Fs*linspace(0,1,L); % сетка по частотам

% построение спектра зашумленного сигнала в диапазоне частот [0

Гц, 2000 Гц] subplot(2,2,3)

plot(f(f<2000),abs(Y(f<2000))) title('Спектр сигнала с шумом')

218

xlabel('Частота (Гц)') ylabel('|Y(f)|')

%нахождение двух основных пиков в спектре зашумленного сигнала в диапазоне частот [0 Гц, 2000 Гц]

[psor,lsor] = findpeaks(abs(Y(f<2000)), 'SortStr', 'descend', 'NPeaks', 2);

fr=f(lsor); x=0; % нахождение частоты пиков

for i=1:1:numel(fr) % цикл по частотам для восстановления сигнала x=x+psor(i)/max(psor)*sin(2*pi*fr(i)*t);

end

%посторение графика зависимости амплитуды восстановленного сигнала от времени

subplot(2,2,4)

plot(Fs*t(1:1000),x(1:1000),'r') title('Восстановленный сигнал') xlabel('Время, мс')

Рис. 19.1. Восстановление зашумленного сингала при помощи фурье-преобразования

219

В примере 19.2 рассматривается спектральный анализ аудиофайла на примере крика голубого кита (рис. 19.2).

Пример 19.2.

% Спектральный анализ крика голубого кита

'examples',

'matlab',

whaleFile

=

fullfile(matlabroot,

'bluewhale.au'); % ссылка на аудиофайл с голосом синего кита; этот файл поставляется вместе с системой MatLab

[x,fs] = audioread(whaleFile); % считывание аудиофайла sound(x,fs); % воспроизведение аудиофайла; файл может быть прослушан

figure % рис. 19.2 subplot(3,1,1)

t=10*(0:1/fs:(length(x)-1)/fs); % перевод дискретизации аудиофайла в сетку по времени

plot(t,x) % построение графика зависимости амплитуды от времени xlabel('Время, с')

ylabel('Амплитуда')

title('{\bf Крик голубого кита}')

subplot(3,1,2)

bCall = x(2.45e4:3.10e4); % bCall - "второе слово" голубого кита tb = 10*(0:1/fs:(length(bCall)-1)/fs); % перевод дискретизации

"второго слова" в сетку по времени

plot(tb,bCall,'m') % построение графика зависимости амплитуды от времени для "второго слова"

xlim([0 tb(end)]) % установление пределов графика по оси Х xlabel('Время, с')

ylabel('Амплитуда') title('{\bf Второе слово}')

m = length(bCall);

% длина "второго слова"

n = pow2(nextpow2(m));

% нахождение числа вида 2^k, которое либо

равно, либо больше длины "второго слова"

y = fft(bCall,n);

% быстрое фурье-преобразование

f = (0:n-1)*(fs/n)/10;

% диапазон частот

p = y.*conj(y)/n;

% мощность множества значений y

subplot(3,1,3)

plot(f(1:floor(n/2)),p(1:floor(n/2)),'r') % построение графика зависимости мощности сигнала от частоты

xlabel('Частота, Гц') ylabel('Мощность')

220

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]