Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 5

Детектирование синусоид в дискретной последовательности

02.10.2012, 22:36. Показов 4149. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Прошу прощения за мой дилетантский язык, но проблема в следующем:
Есть участок дискретного сигнала.
Этот сигнал представляет собой сумму синусоидальных сигналов (синусоиды). Эти синусоиды присутствуют на участке "пакетами", то есть они не обязательно начинаются и заканчиваются в начале и конце рассматриваемого участка.
В качестве примера предлагаю следующее (см. рисунок)
Есть два синусоидальных сигнала: один сигнал на всём протяжении рассматриваемого участка, второй - только на половине рассматриваемого участка.
Вопрос: как детектировать оба сигнала в указанном примере? То есть, как определить частоты этих двух сигналов.
Если бы оба сигнала были на всём протяжении участка, то с определением частот без проблем справился бы обычный Фурье (fft). Но в данном примере Фурье не сможет помочь.
Заранее благодарю!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2012, 22:36
Ответы с готовыми решениями:

Разобраться в разнице между непрерывной, дискретной и непрерывно-дискретной оптимизацией
Добрый день! 1.Помогите, пожалуйста, разобраться в разнице между непрерывной, дискретной и непрерывно-дискретной оптимизацией....

Нарисовать синусоид
Необходимо что бы при нажатие по кнопке рисовалась синусоид на компоненте image !

Сделать волну на ВБ6, например синусоид
пожалуйста помогите сделать волну на ВБ6, например синусоид.

7
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
03.10.2012, 10:36
Цитата Сообщение от LifeLover Посмотреть сообщение
Но в данном примере Фурье не сможет помочь.
сможет)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
clear all; close all; clc;
 
t=(1:1000)/2000;
f1 = 100; f2 = 200; % частоты
 
s1 = sin(2*pi*f1*t);
s2 = sin(2*pi*f2*t); % блоки сигнала
 
s = [s1 s2 s1 s1 s2 s1 s2]; % сигнал
 
subplot(2,1,1); plot(s); axis tight;
 
fftSize = 1024;         % так как окно не совсем точно совпадает с длиной блока
s = [s zeros(1, 1100)]; % дополняем сигнал нулями
 
% строим спектрограмму
for i=1:floor(length(s)/fftSize)
    tmp = abs(fft(s((i-1)*fftSize+1:i*fftSize)));
    sp(:,i) = tmp(1:end/2); %20*log10(tmp(1:end/2));
end
 
subplot(2,1,2); imagesc(flipud(sp)); grid; axis tight;
Миниатюры
Детектирование синусоид в дискретной последовательности  
1
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 5
03.10.2012, 22:24  [ТС]
Спасибо за ответ! Новый для меня способ построения спектрограммы, я пока не могу судить точно, но похоже, что у вас сигнал представляет собой просто последовательность синусоид. А меня интересует ситуация, когда синусоиды накладываются друг на друга. В таких случаях Фурье не может дать точную характеристику каждого отдельного сигнала (за исключением случаев, когда синусоиды совершают целое количество периодов. В таких случаях нет "утечки" коэффициентов Фурье).
К тому же у вас очень большие частоты. Синусоиды успевают совершать сотни периодов. Это, конечно, облегчает детектирование синусоид. Но, увы, в моем случае синусоиды совершают не более 2-3 периода.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
04.10.2012, 08:44
Цитата Сообщение от LifeLover Посмотреть сообщение
интересует ситуация, когда синусоиды накладываются друг на друга.
Это как раз не проблема, если проходить окнами с большим перекрытием на спектрограмме они тоже будут накладываться, но на разных уровнях, если хватит разрешения по частоте.

Прочитал более полную версию описания вашей проблемы на экспоненте, действительно при таком частотно-временном разрешении скорее всего не удастся подобрать размер окна преобразования. По поводу совета применять вейвлеты, честно говоря тоже не уверен что они помогут, но попробовать стоит.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
04.10.2012, 10:20
Лучший ответ Сообщение было отмечено как решение

Решение

Чтобы не быть голословным пришлось писать код)
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
clear all; close all; clc;
 
Fs = 2000;
blockLength = 200;
t=(1:blockLength)/Fs;
f1 = 20; f2 = 60; % частоты
 
block(1, :) = sin(2*pi*f1*t);
block(2, :) = sin(2*pi*f2*t); % блоки сигнала
 
% s = [s1 s2 s1 s1 s2 s1 s2]; % сигнал
codeSeq = [0 1 0 0 1 0 1]; % кодовая последовательность, задающая частоты
s = zeros(1, blockLength*length(codeSeq));
stepSignal = blockLength - 50; % перекрытие в 50 отсчетов
for i=1:length(codeSeq)
    s((i-1)*stepSignal+1 : (i-1)*stepSignal+blockLength) = ...
        s((i-1)*stepSignal+1 : (i-1)*stepSignal+blockLength) + block(codeSeq(i)+1, :);
end
s = s ./ max(s);
 
subplot(2,1,1); plot(s); axis tight;
 
fftSize = 128;
 
stepSpectr = 1; % с максимальным перекрытием
% строим спектрограмму
for i=1:floor(length(s)/stepSpectr - fftSize/stepSpectr)
    tmp = abs(fft(s((i-1)*stepSpectr+1:(i-1)*stepSpectr+fftSize)));
    sp(:,i) = tmp(1:end/4); % до Fs/4
end
 
subplot(2,1,2); imagesc(flipud(sp)); grid; axis tight;
Генерирую сигнал похожий на ваш(на рисунке): нч укладывается примерно 2 периода на блок, вч частота в 3 раза выше.
Сигнал и спектрограмма, когда блоки не перекрываются:


В случае перекрытия на четверть длины блока (на амплитуды пока не будем обращать внимания, они естественно не выровнены):

как видите в моем случае частотно-временного разрешения оказалось достаточно, чтобы выделить синусоиды. Может и в вашем получится...
4
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 5
06.10.2012, 21:27  [ТС]
Спасибо за ответ!
Внимательно изучу пример и сообщу о результатах
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 5
08.10.2012, 23:18  [ТС]
Раз уж речь зашла про форум Exponenta, то предлагаю перенести общение туда. Мне так будет удобнее, чем следить сразу за двумя форумами.
matlab.exponenta.ru/forum/viewtopic.php?p=63325

Добавлено через 5 минут
Спасибо за пример, но в Вашем примере очень малые участки пересекающихся синусоид. И по-прежнему очень много периодов, которые совершают синусоиды. Поэтому мы можем детектировать синусоиды только за счёт тех участков, где синусоиды не пересекаются и совершают несколько синусоид.
Я в течении нескольких минут выложу на экспоненте более сложный пример, если Вам интересно.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 5
23.10.2012, 00:32  [ТС]
Представьте себе планету. Уровень воды на пляже зависит от Луны. Мы все знаем, что Луна притягивает воду. И в сутках нашей планеты 100 земных часов. Вот график:



Теперь представьте, что у нас есть вторая Луна, которая вращается в два раза быстрее вокруг планеты (период 50 земных часов) Луны могут находиться в одной точке, или могут по разные стороны Луны. Таким образом, гравитационные силы двух лун складываются как вектора и мы получим следующую картину.


И это еще не все. Вторая Луна постоянно куда-то исчезают. Никто не знает как. Просто исчезает. Поэтому, когда вторая луна отсутствует, на воду действует сила тяжести только первой луны. Наша вторая Луна стабильно появляется в 27 часов, и исчезает на 64 часу


Добавим третью луну:


Теперь представьте, что мы хотим знать о том, когда Луна исчезнет. Мы также должны знать, как быстро вращаются Луны вокруг планеты. И все это мы можем знать, имея только график уровня воды.

Кто может подсказать, как решить такую задачу алгоритмически?

Добавлено через 49 секунд
Моделирование графиком в Matlab:

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
function [ ] = Run()
    close all;
    clear all;
    clc;
 
      moon1 = CreateMoon(100, 1, 100, 100);
      moon2 = CreateMoon(100, 27, 64, 50);
      moon3 = CreateMoon(100, 50, 70, 75);
 
      subplot(4, 1, 1);
      plot(moon1, '.');
      axis([0, 100, -2, 2]);
      subplot(4, 1, 2);
      plot(moon2, '.');
      axis([0, 100, -2, 2]);
      subplot(4, 1, 3);
      plot(moon3, '.');
      axis([0, 100, -2, 2]);
      subplot(4, 1, 4);
      plot(moon1+moon2+moon3, '.');
      axis([0, 100, -2, 2]);
  end
 
% function create moon
% dayLength - the number of hours in a day
% appearance - time of appearance
% disappearance - time of disappearance
% period - time for a complete orbit around the planet
function [ y ] = CreateMoon(dayLength, appearance, disappearance, period )
  x = 1:dayLength
  y = zeros(1, length(x));
  y(appearance:disappearance) = y(appearance:disappearance) + sin(x(appearance:disappearance) * 2 * pi / period);
end
Добавлено через 5 минут
Меня заинтересовал метод, который, на мой взгляд, лучше помогает решить мою проблему, чем Фурье: эмпирическое разложение (EMD) Посмотрите, какие результаты, достигнуты на примере с лунами


К сожалению, я смог идентифицировать только одну луну (которая никуда не исчезает). Но это уже результат! Получилось алгоритмически найти хотя бы один составляющий сигнал. Я думаю, что это хорошее начало, на пути к решению.


А теперь прошу посмотреть на результаты разложения другого сигнала и сравните их с начальными условиями. Конечно, не 100% результат. Но мы только начали. Я отметил красным карандашом границы сигналов и их периоды.

Matlab M
1
2
3
moon1 = CreateMoon (1000, 1, 1000, 100);
moon2 = CreateMoon (1000, 340, 1000, 33);
moon3 = CreateMoon (1000, 1, 700, 70);


Может быть кто-нибудь подскажет мне что-нибудь о EMD (или о другом подобном методе)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2012, 00:32
Помогаю со студенческими работами здесь

Цикл для генерации нескольких синусоид
не могу реализовать цикл для генерации нескольких синусоид int i = 0; //будем суммировать к частоте для получения новой float summa =...

Как найти точки пересечения двух синусоид?
Есть две синусоиды вида: y = a + b*sin(c*x + d) a,b,c,d - постоянные. x - в заданном интервале, допустим от -10 до +10. Нужно найти...

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

Сумма трех сигналов(синусоид) проходящих через последовательный колебательный контур
нужно написать программу в matlab'е сумма трех сигналов(синусоид) проходящих через последовательный колебательный контур! с помощью...

Детектирование ASK
Здравствуйте! Подскажите пожалуйста как определить пороговое напряжение для детектирования сигнала после амплитудной манипуляции.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru