Линейный/нелинейный для синусоидальной кривой
Я посмотрел этот и this.
Но у меня есть немного другая проблема. Я знаю, что мои данные представляют собой кривую синуса, неизвестного периода и неизвестной амплитуды, с аддитивным негауссовым распределенным шумом.
Я пытаюсь установить его, используя нелинейный алгоритм GSL в C, но приступ абсолютно ужасен. Мне интересно, если я ошибаюсь, используя алгоритм нелинейного подгонки, где я должен использовать линейный?
Как определить, требует ли конкретный набор данных линейный или нелинейный алгоритм?
РЕДАКТИРОВАТЬ: Моя кривая действительно шумная, поэтому при использовании FFT для определения частоты может возникнуть ложные срабатывания и плохие приемы. Я ищу немного более надежный способ подгонки.
![Curve with about 170 points]()
Вышеприведенный график имеет около 170 пунктов, как вы можете видеть, и нижеприведенный сюжет имеет около 790 баллов.
![enter image description here]()
Шум явно не гауссовый и большой по сравнению с амплитудой данных. Я пробовал FFT на гауссовском распределенном шуме, и моя подгонка была замечательной. Здесь он плохо работает.
ДОБАВЛЕНО: Ссылка на первые данные временных рядов. Каждый столбец в файле представляет собой другой временной ряд.
Ответы
Ответ 1
Если вы знаете, что ваши данные являются синусоидальной кривой (которая может быть представлена как ряд сложных экспонент), то вы можете использовать гармоническое разложение Писаренко; http://en.wikipedia.org/wiki/Pisarenko_harmonic_decomposition
Однако, если у вас есть доступ к большему количеству точек данных, мой подход по-прежнему будет использовать DFT.
UPDATE:
Я использовал грамматическое разложение Писаренко (PHD) на ваших данных, и даже несмотря на то, что ваши сигналы очень короткие (всего 86 точек на каждый), алгоритм PHD определенно имеет потенциал, если имеется больше доступных данных. Ниже приведены два (столбец 11 и 13 ваших данных) из 24 сигналов, изображенных синим цветом, а кривая синуса в красном соответствует расчетным значениям амплитуды/частоты от PHD. (обратите внимание, что сдвиг фазы неизвестен)
![plot of data in column 11]()
![plot of data in column 13]()
Я использовал MATLAB (pisar.m) для выполнения PHD: http://www.mathworks.com/matlabcentral/fileexchange/74
% assume data is one single sine curve (in noise)
SIN_NUM = 1;
for DATA_COLUMN = 1:24
% obtain amplitude (A), and frequency (f = w/2*pi) estimate
[A f]=pisar(data(:,DATA_COLUMN),SIN_NUM);
% recreated signal from A, f estimate
t = 0:length(data(:,DATA_COLUMN))-1;
y = A*cos(2*pi*f*t);
% plot original/recreated signal
figure; plot(data(:,DATA_COLUMN)); hold on; plot(y,'r')
title({'data column ',num2str(DATA_COLUMN)});
disp(A)
disp(f)
end
В результате
1.9727 % amp. for column 11
0.1323 % freq. for column 11
2.3231 % amp. for column 13
0.1641 % freq. for column 13
ПРОВЕРКА PHD:
Я также провел еще одно испытание, в котором знал значения амплитуды и частоты, а затем добавил шум, чтобы увидеть, может ли PHD правильно оценить значения из шумного сигнала. Сигнал состоял из двух добавленных синусоидальных кривых с частотами 50 Гц, 120 Гц соответственно и амплитудами 0,7, 1,0 соответственно. На рисунке ниже кривая красного цвета является оригинальной, а синий - с добавленным шумом. (рисунок обрезается)
![test of PHD accuracy]()
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sample time
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
y = x + 0.4*randn(size(t)); % Sinusoids plus noise
figure;
plot(Fs*t(1:100),y(1:100)); hold on; plot(Fs*t(1:100),x(1:100),'r')
title('Signal Corrupted with Zero-Mean Random Noise (Blue), Original (Red)')
[A, f] = pisar(y',2);
disp(A)
disp(f/Fs)
PHD оценил значения amp/freq:
0.7493 % amp wave 1 (actual 0.7)
0.9257 % amp wave 2 (actual 1.0)
58.5 % freq wave 1 (actual 50)
123.8 % freq wave 2 (actual 120)
Неплохо для довольно много шума, и только зная количество волн, из которых состоит сигнал.
ОТВЕТ @Alex:
Да, это хороший алгоритм, я наткнулся на него во время моих исследований DSP, и я подумал, что это работает неплохо, но важно отметить, что Pisarenko Harm.Dec. моделирует любой сигнал в виде N > 0 синусоидов, N указывается с начала, и он использует это значение для игнорирования шума. Таким образом, по определению, он ТОЛЬКО полезен, когда вы точно знаете, как человек синусоиды из ваших данных. Если у вас нет понятия значения для N, и вам нужно запустить алгоритм для тысячи разных значений, тогда определенно рекомендуется другой подход. Тем не менее, оценка после этого является простой, поскольку она возвращает значения N амплитуды и частоты.
Множественная классификация сигналов (MUSIC) - это еще один алгоритм, который продолжается, когда Писаренко остановился. http://en.wikipedia.org/wiki/Multiple_signal_classification
Ответ 2
Kitchi: Не могли бы вы предоставить некоторые примеры данных? Как долго вы должны работать с типичным сигналом? (по количеству выборок и количеству периодов синусоидальной волны) Какое отношение сигнал/шум в дБ?
-
Прежде чем вы узнаете, какой алгоритм будет работать, я рекомендую вам прототип его в python/numpy/scipy (или matlab/octave, или R/S, или Mathematica...), какой язык или набор прототипов ваш любимый, кроме C. Это сэкономит огромное количество времени, и вы будете работать с гораздо более богатыми инструментами.
-
Вы уверены, что шум плохо повлияет на FFT? Это не обязательно хорошее предположение, особенно если шум относительно "белый", а окно анализа длинное. Если частота синусоидальной волны очень стабильна, вы можете сделать огромный БПФ и вытащить сигнал из порядка шума, превышающего сигнал. Попробуйте что-то порядка от нескольких сотен до нескольких миллионов циклов ожидаемой синусоиды.
-
Кривые синусоидальные волны просто не работают. Я предполагаю, что периодичность создает множество локальных минимумов, а переменная фазового сдвига также делает проблему значительно нелинейной. Вы можете увидеть некоторые вопросы от других людей, которые столкнулись с одной и той же проблемой, связанной ниже. Вам лучше было бы попробовать почти что угодно, а не подстраивать нелинейные наименьшие квадраты, если вы не предварительно линеаризуете проблему, что подводит меня к...
-
Автокорреляция отлично подходит для такого рода вещей. Попробуйте вычислить автокорреляцию на весь ваш сигнал сразу (чем больше данных, тем лучше, если частота источника стабильна). Период синусоидальной волны должен быть очень очевиден как высокий пик автокорреляции, и вы, вероятно, получите более точную оценку частоты, чем при использовании FFT (если вы не используете чрезвычайно большой FFT). Кроме того, вы можете рассчитать среднюю амплитуду от высоты первого максимума автокорреляции максимума.
РЕДАКТИРОВАТЬ. При дальнейших исследованиях есть больше методов, которые могут быть лучше подходят для вашей проблемы, чем БПФ. Гармоническое разложение Писаренко (впервые предложенное Фредриком Рубиным ниже) - одно; другой - Спектральный анализ наименьших квадратов (LSSA), который очень похож на вашу оригинальную идею вопроса. Существует несколько вариантов LSSA, например Lomb-Scargle, базовое преследование и т.д., Которые имеют дело с различными задачами, которые я описал выше. Однако я думаю, что если вы абсолютно не видите никакого сигнала в большом БПФ, ни один из других методов, скорее всего, не найдет ничего:)
P.S. По другим вопросам, связанным с тем, что вы не можете хорошо подходить к синусоидальным волнам, см.:
Ответ 3
Если вы делаете регрессию по поводу греха, вы можете применить преобразование Фурье с помощью FFT.
ИЗМЕНИТЬ
Попробуйте удалить шум с фильтром. Если у вас есть физический источник, например датчик, установите фильтр нижних частот на датчик. FFT - это относительный плохой фильтр.
EDIT2 - это измерение просто неверно
Возможно, вы ошибаетесь. Согласно теореме выборки Найквиста-Шеннона ваша частота дискретизации слишком низкая или слишком высокая частота ввода. Это приводит к решению WRONG, потому что если вы используете выборку, например, 3 кГц с частотой 5 кГц, вы будете измерять 2 кГц в соответствии с этой теоремой.
Я уверен, что вы не можете сказать правильную входную частоту с таким измерением.
Ответ 4
Это на самом деле проблема спектральной оценки. Вы пытаетесь оценить "линейный спектр", где вы знаете количество синусоидальных волн, которое у вас есть (в вашем случае одно). Методы вроде MUSIC или ESPRIT должны быть в состоянии решить проблему.
Для справки, книга Stoica пригодится. Глава 4 этой книги - это параметрические методы для линейных спектров, в которых содержатся алгоритмы поиска амплитуды, фазы и частоты желаемого сигнала. Книга также поставляется с алгоритмами, реализованными в MATLAB, их также легко реализовать самостоятельно.