Использование FFT для извлечения частоты - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть сигнал, представляющий собой линейную комбинацию двух частот, и я пытаюсь использовать MATLAB, чтобы определить, из каких частот состоит (основной) сигнал. В качестве входа у меня есть частота дискретизации rate и вектор строки с данными сигнала segment.

Теперь у меня есть следующий код:

N=length(segment);

freq = rate*(0:N/2)/N;
X = fft(segment);
X=X(1:N/2+1);

plot(freq*2, abs(X))

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

Следовательно, если мой сигнал создается линейной комбинацией сигнала 30 Hz и одного из 60 Hz, то я хочу signal = [30,60]. Я могу создать график и затем определить его, но я хочу вырезать этого посредника и просто вернуть найденные частоты, не используя никаких наборов инструментов.

Как я могу найти желаемые частоты?

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Без наборов инструментов: выберите порог, который вы считаете приемлемым, затем просто наберите abs(x)>threshold, что даст вам логический массив для индексации в freq, давая частоты выше порога. Для повышения точности вы можете затем выполнить такие действия, как diff(), в результирующем массиве и найти соседние индексы, а затем выбрать максимальное значение для этих последовательных индексов в этой последовательности в качестве «пика».

В качестве альтернативы вы можетеsort() значений, сохраните индексы максимальных n (в вашем случае 2) значений и внесите их в частотные массивы. Опять же, не очень надежный метод, но быстрый и грязный.

Комбинируя два вышеупомянутых метода, вы можете итеративно снизить пороговое значение в соответствии с отсортированным массивом, а затем проверять наличие близких вершин, их выдающуюся значимость и т. Д.

Если вы не хотите реализовывать все это самостоятельно, см. Ниже информацию об универсальной функции для этого.


Если вы хотите использовать набор инструментов для обработки сигналов, вы можете использоватьfindpeaks(). Это дает вам индексы, которые вы затем можете использовать для индексации вашего частотного массива, чтобы получить желаемые частоты. Или используйте синтаксис peaks = findpeaks(data,x) для непосредственного извлечения местоположения x (частоты в вашем случае).

0 голосов
/ 11 ноября 2019

В конечном итоге я использовал функцию max(). Это вернет пик, и тогда соответствующий x-индекс будет соответствовать правильной частоте. Получив эту частоту, я выбрал определенную скобку вокруг пика и установил эти индексы равными нулю. Затем я снова запускаю max(), чтобы найти второй пик и соответствующую ему частоту.

0 голосов
/ 11 ноября 2019

2 простых способа:

1 / взять возвращенный массив FFT и заменить секцию каждым из пиков (по 1 за раз) и заменить нулями (так что вы получите только 1 пик. Затем выполните обратное преобразование (используя numpy do: numpy.fft.ifft (отредактированный массив fft)) для массива, чтобы получить сигнал без обнуленной частоты.

2 / Если вы знаете фазу исходных сигналов -возьмите по одному и создайте новый сигнал только с этой частотой и инвертируйте его (т. е. 0-сигнал - там, где он вырос, теперь он понижается!). И добавьте его к исходному сигналу. Эта частота исчезнет из аудиосигнал с необходимостью fft (кроме проверки ваших результатов.

С уважением, Тони

...