Изменение содержимого FFT - PullRequest
       5

Изменение содержимого FFT

2 голосов
/ 16 декабря 2011

Предположим, у вас есть некоторые данные, представляющие собой тон плюс шум.

t=0:0.01:10;
y=sin(t) + rand(1,length(t));

Я пытаюсь сбить пики тона в БПФ, чтобы при выполнении ifft были получены только данные о шуме. Мой алгоритм - это цикл for, который просматривает каждый индекс abs (fft) для поиска пика. Если есть пик, я бы заменил этот пик на шумный пункт данных.

Проблема в том, что после выполнения fft для визуализации данных обычно я использовал бы plot (abs (fft)). Однако, чтобы сделать это, мнимые данные также необходимы. Таким образом, я не уверен, как именно я мог бы «сбить пик» или избавиться от него, чтобы я мог использовать функцию ifft. Я думаю, что мне придется работать с воображаемыми числами.

Есть предложения? : X

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Вам придется работать с воображаемыми числами, но я не понимаю, почему это проблема.Вы все еще можете искать пики, используя представление величины (abs), но когда вы «сбиваете их с толку», вы устанавливаете другое сложное значение.Вам решать, как вы хотите определить, каким должно быть это значение - вы можете установить его на ноль, интерполировать локальные частоты, вставить случайное число ...

Редактировать re: ваш комментарий:

Не позволяйте воображаемым числам сбить вас с толку.Во всяком случае, они на самом деле не "воображаемые"!Просто для того, чтобы представить синусоидальную волну на данной частоте, вам нужны два значения: величина и фаза.Величина - это то, на что вы привыкли смотреть, и она определяет сколько данной частоты мы имеем.Фаза определяет сдвиг относительно некоторой точки (например, t = 0), что также очень важно.В качестве примера возьмем БПФ для сигналов (скажем, синусоидальной и косинусной волны) с одинаковой частотой - величины будут выглядеть одинаково, но фаза будет другой!Если бы у нас не было фазы, IFFT не знал бы, дать ли нам синусоидальную или косинусоидальную волну, или что-то среднее между ними.

Конечно, величина и фаза - это не то же самое, что реальная имнимый, но есть простая формула для их преобразования.В любом случае мы используем два числа для представления каждой частоты.

1 голос
/ 16 декабря 2011

Вы можете искать «пики» в сигнале abs(fft(y)) и заменять их случайными комплексными значениями, просматривая дисперсию самого БПФ, что-то вроде

h = fft(y);

peaks = your_peak_finding_algorithm(abs(fft(y)));

real_noise = std(real(h));
imag_noise = std(imag(h));

h(peaks) = real_noise*randn(size(peaks)) + i*imag_noise*randn(size(peaks))

y_new = ifft(h);

Однако Я сильно сомневаюсь, действительно ли это то, что вы хотите сделать.Если это академическое упражнение, тогда хорошо, но если это для какого-либо реального применения, то я бы посоветовал провести небольшое исследование.Существует тонна литературы по шумоподавлению, а также по обнаружению и фильтрации тонов в сигналах.

Также примечание В fft содержится больше информации, чем просто об одной пиковой точке, связанной с вашей синусоидой.См. Оконная функция .Это зависит от выборки вашего сигнала по сравнению с его пропускной способностью, а также от свойств шума.

...