Форум программистов, компьютерный форум, киберфорум
Наши страницы
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
1

БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ

16.08.2016, 13:45. Просмотров 790. Ответов 11
Метки нет (Все метки)

Всем добра! В математике я нуб, нужна помощь в решение задачи в Matlab!!!

Дано:
1) Частота дискретизации Fd=45000 Гц;
2) Кол-во отсчетов N=2048;
3) Сигнал, записанный в массив 16384х1 (файл dat);
Выполнить:
1) Быстрое преобразование Фурье сигнала;
2) Определить начальную частоту Хн, соответствующую максимальной спектральной составляющей в области главного лепестка сигнала;
3) Используя Хн в качестве начальной оценки определить максимальное значение Хмакс, соответствующее максимуму интегрально-дискретного преобразования Фурье:

Во вложении функция для 3) и файл записанного сигнала.

Дискретная ошибка БПФ +-36(Гц), это связано с дискретностью спектра сигнала, выполнение 3) должно обеспечивать нахождение максимума спектра с точностью не хуже +-5(Гц). Задача состоит по сути в повышении точности измерения частоты сигнала.



Добавлено через 3 часа 12 минут
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%% Параметры
 
N=16384;%Общее количество отсчетов БПФ
i=(1:N);%Отсчеты БПФ
Fd=20000;%Частота дискетизации (Гц)
           
figure(1)
plot(sig(i)),grid;
y=fft(sig,N);
pyy = y.*conj(y)/N;
f = Fd*(0:8191)/N;
Udc = pyy(1);
pyy(1)=0;
figure(2)
plot(f, pyy(1:8192)), grid;
max(pyy);
Результат
ans = 1.2721e+09

Есть кто дома???

Максимальную гармонику определил, но для дальнейшего анализа нужно знать номер ячейки, как определить номер ячейки с максимальной амплитудой (N=?).???
0
Миниатюры
БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ   БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ  
Вложения
Тип файла: zip sig.zip (101.6 Кб, 4 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2016, 13:45
Ответы с готовыми решениями:

Поиск максимума методом Фибоначчи
Доброе всем время суток!! Хотела бы попросить помощи в построении кода программы метода Фибоначчи...

Поиск минимума и максимума функции
Здравствуйте, только начала изучать Матлаб и столкнулась вот с такой задачей: необходимо найти...

Поиск максимума в массиве методом касательных и методом Ньютона-Рафсона
Существует массив с двумя столбцами, переменные следует обозвать х и у. Задание: написать программы...

График спектральной плотности мощности
Добрый день! Прошу прощения, что задаю глупые вопросы. Прошу помочь знающих. Есть файл данных шума....

БПФ бинарного сигнала, поиск частоты и фазы
Вляпался по неосторожности в ЦОС, совсем не мою область. Есть светодиод. Он мигает с частотой...

11
VADIM290692
25 / 25 / 16
Регистрация: 26.02.2013
Сообщений: 143
17.08.2016, 17:25 2
можно например так:
Matlab M
1
[ans2,nans]=max(pyy)
ans2 - содержит значение максимального элемента, а nans - его номер.

Добавлено через 8 минут
чет у вас исходные данные не соответствуют тому, что в коде?
Цитата Сообщение от profafan Посмотреть сообщение
Дано:
1) Частота дискретизации Fd=45000 Гц;
2) Кол-во отсчетов N=2048;
а в коде:
Цитата Сообщение от profafan Посмотреть сообщение
Fd=20000;%Частота дискетизации (Гц)
Добавлено через 19 минут
и еще, вы уверены что таким образом правильно спектр посчитали:
Цитата Сообщение от profafan Посмотреть сообщение
y=fft(sig,N);
pyy = y.*conj(y)/N;
Добавлено через 13 минут
просто сигнал, очевидно, имеет постоянку, но у вас она равна нулю, при этом есть две гармоники в районе 3 кГц с "опупенными" амплитудами

посчитал так (в файле sif.mat средний столбец из вашего прикрепленного файла)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
%% Параметры
clear all% Очистка памяти
load sif.mat
N=16384;%Общее количество отсчетов БПФ
Fd=20000;%Частота дискетизации (Гц)
Tm=(N-1)/Fd;% Длина сигнала (с)
FftL=2048;% Количество линий Фурье спектра
 
%% Генерация рабочих массивов
T=0:1/Fd:Tm;% Массив отсчетов времени
%% Спектральное представление сигнала
FftS=abs(fft(sig,FftL));% Амплитуды преобразования Фурье сигнала
FftS=2*FftS./FftL;% Нормировка спектра по амплитуде
FftS(1)=FftS(1)/2;% Нормировка постоянной составляющей в спектре
 
%% Построение графиков
subplot(2,1,1);% Выбор области окна для построения
plot(T,sig);% Построение сигнала
title('Сигнал');% Подпись графика
xlabel('Время (с)');% Подпись оси х графика
ylabel('Амплитуда (Попугаи)');% Подпись оси у графика
subplot(2,1,2);% Выбор области окна для построения
F=0:Fd/FftL:Fd/2-Fd/FftL;% Массив частот вычисляемого спектра Фурье
plot(F,FftS(1:length(F)));% Построение спектра Фурье сигнала
title('Спектр сигнала');% Подпись графика
xlabel('Частота (Гц)');% Подпись оси х графика
ylabel('Амплитуда (Попугаи)');% Подпись оси у графика
получилось так
БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ

метод взял отсюда
1
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
17.08.2016, 21:19  [ТС] 3
VADIM290692, благодарствую за ответы! Да действительно в частота дискретизации и кол-во отсчетов было уточнено , но посты тут на форуме редактировать уже нельзя, коментировать не стал не надеялся на ответ. Пишу не с "того компа", поэтому завтра только проверю [ans2,nans]=max(pyy) заинтригован))) Постоянка в сигнале есть, ее удалил обнулив первую ячейку массива.

Это y=fft(sig,N); pyy = y.*conj(y)/N; взял из примера найденного на просторах...

Гармоники на 3 кГц это и есть полезный сигнал. Завтра скину отредактированный код.

Команда clear all удаляет импортированные в matlab данные, а именно сам массив сигнала? попробую прописать путь к файлу на диске.
0
VADIM290692
25 / 25 / 16
Регистрация: 26.02.2013
Сообщений: 143
18.08.2016, 07:40 4
Команда clear all удаляет все, что накопилось в рабочем пространстве за активную сессию
0
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
18.08.2016, 08:27  [ТС] 5
VADIM290692, подгрузил другой файл данных (во вложении архив с файлом p3030.mat), соответственно изменил параметры, но не суть важно, принцип тот-же. Вот что получилось:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
clear all% Очистка памяти
load 'D:\Matlab\p3030.mat'% Загрузка файла
%% Параметры и переменные
N=16384;%Общее количество отсчетов БПФ
i=(1:N);%Отсчеты БПФ
Fd=16394;%Частота дискретизации (Гц)
%Сигнал в виде массива в файле данных
k=kaiser(N);%Весовая функция Кайзера-Бесселя
sig=p3030;
 
%% Построение временной диаграммы         
figure(1)%Временная диаграмма
plot(sig(i)),grid;%Построение графика с сеткой
title ('Временная диаграмма');%Название диаграммы
xlabel('Отсчеты БПФ(N)');%Метка диаграммы по оси Ox
ylabel('Амплитуда сигнала');%Метка диаграммы по оси Oy
 
%% Выполнение БПФ и вычисление спектральной плотности  
y=fft(sig,N);%БПФ сигнала (сигнал в комплексном виде)
spa = y.*conj(y)/N;%Вычисление спектральной плотности амплитуд(сигнал в числовом виде)
Udc = spa(1);%Постоянная составляющая сигнала
spa(1)=0;%вычитание постоянной составляющей из сигнала (первая ячейка массива=0)
 
%% Построение частотной диаграммы
figure(2)%Частотная диаграмма
f = Fd*(0:8191)/N;%Нормировка частотной шкалы (исключение зеркальной составляющей спектра)
plot(f, spa(1:N/2)), grid;%Построение графика с сеткой
title ('Спектр сигнала');%Название диаграммы
xlabel('Частота сигнала(Гц)');%Метка диаграммы по оси Ox
ylabel('Амплитуда сигнала');%Метка диаграммы по оси Oy
 
%% Поиск максимальной спектральной составляющей в области главного лепестка
[ans2,nans]=max(spa);
1) Load работает отлично, спс не знал такой простой функции;
2)clear all тоже в копилку;
3)[ans2,nans]=max(spa) тоже сработало, однако по расчету nans=1158, а SPTool показал без округления значение 1557.9503;
4) Когда вывожу спектр через SPTool на графике присутствуют какие-то шумы, в ручном режиме через код таких шумов нет, непонятки.
0
Миниатюры
БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ  
Вложения
Тип файла: zip p3030.zip (25.9 Кб, 2 просмотров)
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
18.08.2016, 08:53  [ТС] 6
По 4) разобрался, SPTool выводил в логарифмическом масштабе, а я в линейном...

Добавлено через 17 минут
Ссылка на пример БПФ http://www.exponenta.ru/soft/matlab/potemkin/book2/chapter8/fft.asp
0
VADIM290692
25 / 25 / 16
Регистрация: 26.02.2013
Сообщений: 143
18.08.2016, 08:58 7
в SPTool можно сменить масштаб по осям так: Options->Magnitude Scale, где выбираете Linear
вот что вышло у меня
БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ


какая все таки частота дискретизации у вас?

Добавлено через 7 минут
и там еще в SPTool фильтром сигнал обрабатывается, вы какие параметры ставили?
0
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
18.08.2016, 09:20  [ТС] 8
Когда в SPTool ставишь линейный масштаб он постоянку на весь график рисует, на фоне которой не видно полезный сигнал. Фильтры вроде не ставил не какие, только кол-во отсчетов и все. Так что делать с округлением? nans=1158, а SPTool показал без округления значение 1557.9503. Частота Fd=16394;%Частота дискретизации (Гц)
0
VADIM290692
25 / 25 / 16
Регистрация: 26.02.2013
Сообщений: 143
18.08.2016, 09:32 9
Цитата Сообщение от profafan Посмотреть сообщение
nans=1158, а SPTool показал без округления значение 1557.9503.
так nans это номер ячейки в массиве, а не частота. SPTool показывает частоту. умножьте значение nans на шаг по частоте.

Добавлено через 1 минуту
а вас не пугает что в принципе у вас разный результат получился через код и через SPTool?
1
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
18.08.2016, 09:59  [ТС] 10
Частотное разрешение=16394/16384=1,0006103515625 (Гц). Если номер отсчета nans=1158, то частота сигнала= 1158х1,0006103515625= 1158,706787109375 (Гц), а SPTool выдает значение 1557.9503 (Гц).

Добавлено через 6 минут
а вас не пугает что в принципе у вас разный результат получился через код и через SPTool?
Так на графиках спектра все совпадает.

Добавлено через 7 минут
так nans это номер ячейки в массиве, а не частота. SPTool показывает частоту. умножьте значение nans на шаг по частоте.
Все так, действительно...
0
VADIM290692
25 / 25 / 16
Регистрация: 26.02.2013
Сообщений: 143
18.08.2016, 10:42 11
Цитата Сообщение от profafan Посмотреть сообщение
Так на графиках спектра все совпадает.
посмотрите на график сигнала, там постоянка где то чуть больше 1000, а SPTooL, если вы линейный масштаб поставите, покажет >10^5. Там нормировка какая то другая, не могу пока понять.
1
profafan
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 23
18.08.2016, 10:49  [ТС] 12
Да, видимо нормировка иная, но думаю не стоит заостряться на этом. Подскажите, как мне в matlab эту функцию затащить, интересует именно код этой функции
0
Миниатюры
БПФ, поиск максимума спектральной плотности, поиск экстремума (максимума) в отсчетах БПФ  
18.08.2016, 10:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2016, 10:49

Поиск БПФ от массива синусоид с разными амплитудами
Здравствуйте, помогите правильно написать программу. Цель: 1) посчитать быстрое преобразование...

Поиск максимума
Здравствуйте пожалуйста, помогите разобраться с блок схемой есть решённая задача, только не могу...

Поиск максимума
Помогите пожалуйста в следующем вопросе. Имеется массив данных. Известно, что в массиве имеются...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru