2017-01-14 8 views
1

У меня есть периодический сигнал 375 наблюдений ниже:Как суммировать периодический сигнал в несколько индексов, чтобы перестроить его снова

enter image description here

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

EDIT: data.

+0

Можете ли вы загрузить данные где-нибудь (Dropbox, gist.github.com, pastebin и т. Д.)? Кроме того, * пожалуйста * опишите хотя бы один метод, который вы пробовали. Мой первый инстинкт будет принимать БПФ и хранить верхние значения N и их соответствующие ячейки. Вам также необходимо указать некоторый допустимый погреш, который будет определять то, что N. –

+0

@AhmedFasih Я пробовал FFT, но я хочу хранить меньше N значений, так как N может быть очень большим, и я хочу сохранить память. Моя идея заключалась в том, чтобы найти 10-12 коэффициентов, чтобы воспроизвести первый период сигнала, а затем повторить его столько раз, сколько мне нужно. Я добавил ссылку Dropbox с данными в вопрос. – Francesco

+0

Если ваши данные являются периодическими, тогда большинство коэффициентов FFT будут (близки к нулю). Таким образом, вы сохраните только большие коэффициенты и их частотный бит. Позвольте мне взглянуть на ваши данные, чтобы убедиться, что это хорошо. Кроме того, БПФ не является единственной основой, которую можно использовать, - вы также можете использовать любые вейвлет-базы, например. Проблема здесь в том, что вы дали только один сигнал, и для этого мы можем найти хороший компрессор, но не для других сигналов. –

ответ

1

Вы пытались извлечь верхние 10-20 пиков из БПФ? В зависимости от вашего сигнала это может быть достаточно (обратите внимание на частоту дискретизации, длину файла и т. Д.). Это можно сделать следующим образом:

library(pracma) 
data <- read.csv('DataStackOverflow.csv', header=TRUE) 
x <- data$x 
z <- fft(x) 
pks <- findpeaks(Mod(z), npeaks = 20, sortstr = TRUE) 

Информация хранится в pks [высота, время].

X1 (height), X2 (time) 
15.339362, 251 
15.339362, 126 
14.763523, 235 
14.763523, 235 
(...) 

Чтобы запустить обратный fft, замените пики + фазу в пустой FT. Я сделал это, удалив ненужные данные из z только для примера.

z [ Mod(z) < min(pks$X1) ] <- 0+0i 
y <- fft(z, inverse = TRUE)/length(z) 

Original and new signals for npeaks in [10, 20, 60, 100]

Для того, чтобы хранить информацию, я предполагаю, что функция findpeaks сама с одним периодом будет вполне достаточно.

+0

есть только одна вещь, которую я не понял: как я могу восстановить исходный сигнал от обратного fft? Потому что, когда я рисую (например) y, результаты действительно далеки от исходного сигнала. – Francesco

+0

Результат обратного БПФ является сложным. Убедитесь, что вы построили реальную часть y: 'Re (y)'. – Jbalberge

 Смежные вопросы

  • Нет связанных вопросов^_^