
Частота сигнала – ключевой параметр в обработке данных, особенно при анализе аудио, радиосигналов или временных рядов. MATLAB предоставляет инструменты для точного расчета частоты с использованием дискретного преобразования Фурье (ДПФ) и функции fft. Однако без правильной настройки параметров результат может быть искажен шумом или эффектом подмены частот (aliasing). В этой статье рассмотрен алгоритм из 5 шагов, который минимизирует ошибки и обеспечивает точность до 0.1 Гц при частоте дискретизации 44.1 кГц.
Первый шаг – корректный выбор частоты дискретизации (Fs). Если Fs меньше удвоенной максимальной частоты сигнала (по теореме Найквиста), возникает aliasing. Например, для анализа сигнала с частотой до 5 кГц Fs должна быть не менее 10 кГц. В MATLAB это задается при генерации или импорте данных: Fs = 44100; для стандартного аудиосигнала. Второй шаг – применение оконной функции (например, Хэмминга или Ханна) для снижения спектральных утечек. Без этого амплитуда пиков в спектре может быть занижена на 10–15%.
Третий шаг – вычисление ДПФ с помощью fft. Важно использовать нулевое дополнение (zero-padding) для повышения разрешения спектра. Например, если длина сигнала N = 1024, дополнение до 2^14 точек улучшит разрешение в 16 раз. Четвертый шаг – поиск пика в амплитудном спектре. Для этого применяется findpeaks с порогом, исключающим шум. Последний шаг – пересчет индекса пика в частоту по формуле: f = (index-1) * Fs / N, где N – длина ДПФ.

Проверьте частоту дискретизации сигнала. Если она неизвестна, оцените ее по спектру с помощью pwelch() или periodogram(), сравнив пики с известными гармониками. Для сигналов с неравномерным шагом по времени используйте resample() с интерполяцией. Пример: y_resampled = resample(y, 10, 9) увеличит частоту дискретизации на 10/9. Избегайте чрезмерного передискретизации – это увеличивает вычислительные затраты без улучшения точности.
Удалите постоянную составляющую сигнала, если она не несет полезной информации. Для этого вычтите среднее значение: y = y - mean(y). В случае дрейфа нуля примените высокочастотный фильтр или функцию detrend() с параметром 'linear' для линейного тренда. Для нелинейных трендов используйте полиномиальную аппроксимацию через polyfit() и вычитание результата из исходного сигнала.
Сегментируйте сигнал на участки с однородными характеристиками. Для стационарных процессов выбирайте окна длиной от 1024 до 8192 отсчетов – это оптимальный баланс между разрешением по частоте и вычислительной нагрузкой. Применяйте перекрытие окон на 50–75% для снижения эффекта утечки спектра. Для нестационарных сигналов используйте короткие окна (256–512 отсчетов) с адаптивным шагом. MATLAB предоставляет buffer() для разбиения сигнала на сегменты с заданным перекрытием.
Нормализуйте амплитуду сигнала, если требуется сравнение спектров разных записей. Используйте y = y / max(abs(y)) для приведения к диапазону [-1, 1]. Для сигналов с шумом применяйте нормировку по среднеквадратичному значению: y = y / rms(y). Избегайте нормировки, если важна абсолютная амплитуда гармоник – например, при анализе вибраций механизмов.
Подавите шум с помощью фильтрации. Для белого шума используйте фильтр нижних частот с частотой среза, превышающей максимальную частоту полезного сигнала на 20–30%. Пример реализации КИХ-фильтра: d = designfilt('lowpassfir', 'FilterOrder', 50, 'CutoffFrequency', 1000, 'SampleRate', fs). Для импульсных помех эффективен медианный фильтр medfilt1() с окном 3–5 отсчетов. Избегайте чрезмерной фильтрации – это искажает фазу и амплитуду гармоник.
Сохраните подготовленные данные в структуру для дальнейшего анализа. Пример: signal_data.y = y; signal_data.fs = fs; signal_data.time = (0:length(y)-1)/fs;. Для многоканальных сигналов используйте массивы ячеек или структуры с полями для каждого канала. Добавьте метаданные: дату записи, условия эксперимента, тип датчика. Это упростит повторный анализ и исключит ошибки при интерпретации результатов.
Визуализируйте сигнал перед анализом. Постройте временной график с помощью plot(time, y) и спектрограмму через spectrogram(y, 1024, 512, 1024, fs). Проверьте наличие артефактов: выбросов, насыщения, периодических помех. Для аудиосигналов используйте sound(y, fs) – слуховой контроль часто выявляет аномалии, незаметные на графиках. Если сигнал содержит неожиданные пики или провалы, уточните параметры предобработки.
Выбор метода частотного анализа: БПФ или спектрограмма

Быстрое преобразование Фурье (БПФ) – оптимальный выбор для стационарных сигналов с постоянными частотными компонентами. Алгоритм FFT в MATLAB (`fft()`) обеспечивает высокую разрешающую способность по частоте (Δf = Fs/N, где Fs – частота дискретизации, N – число точек) и минимальные вычислительные затраты (O(N log N)). Однако БПФ теряет информацию о временной динамике: при анализе нестационарных сигналов (например, речевых или модулированных) оно усредняет спектр по всему временному окну, скрывая локальные изменения. Для сигналов длительностью менее 100 мс или с дрейфом частоты более 5% от несущей БПФ дает искаженные результаты – в таких случаях требуется предварительная сегментация или использование оконных функций (Хэмминга, Ханна) с перекрытием 50–75%.
Спектрограмма (`spectrogram()`) преобразует сигнал в двумерный массив частотно-временных компонент, сохраняя динамику изменений. Метод основан на последовательном применении БПФ к коротким сегментам сигнала (обычно 256–2048 точек) с перекрытием, что позволяет отслеживать частотные сдвиги с разрешением по времени Δt = (1–overlap)*L/Fs (L – длина сегмента). Ключевые параметры: размер окна (меньше – лучше временное разрешение, хуже частотное), тип окна (Блэкмана-Харриса для подавления боковых лепестков) и перекрытие (рекомендуется 75% для баланса). Спектрограммы критичны для анализа сигналов с ЧМ/АМ-модуляцией, переходными процессами или шумами, где БПФ дает ложные пики. Однако вычислительная сложность спектрограммы выше (O(N*M log M), где M – длина сегмента), а интерпретация требует визуального анализа или дополнительной обработки (например, пороговой фильтрации).
Настройка параметров дискретизации и оконной функции

Частота дискретизации (*Fs*) определяет разрешение спектрального анализа: при *Fs=44.1 кГц* и длине сигнала *N=8192* точек разрешение по частоте составит *Δf=Fs/N≈5.38 Гц*. Для сигналов с доминирующими частотами ниже *1 кГц* рекомендуется снижать *Fs* до *8–16 кГц*, чтобы уменьшить вычислительные затраты без потери точности. При работе с нестационарными сигналами (например, аудиозаписи речи) используйте перекрытие окон (*overlap*) на *50–75%* для сглаживания переходов между сегментами. Для гармонических сигналов с высоким соотношением сигнал/шум (*SNR>30 дБ*) достаточно *Fs=2.5·f_max*, где *f_max* – максимальная ожидаемая частота.
Выбор оконной функции критичен для подавления боковых лепестков спектра: окно Ханна (*hann*) с параметром *α=0.5* обеспечивает компромисс между разрешением (*–3 дБ* на ширину главного лепестка) и подавлением утечек (*–67 дБ* для первого бокового лепестка), что оптимально для большинства задач. Для сигналов с близкими частотами (разнос менее *3·Δf*) применяйте окно Блэкмана-Харриса (*blackmanharris*), снижающее боковые лепестки до *–92 дБ*, но расширяющее главный лепесток в *1.7 раза*. При анализе импульсных сигналов используйте прямоугольное окно (*rectwin*) для сохранения фронтов, но учитывайте высокий уровень утечек (*–13 дБ*). Для корректного сравнения амплитуд спектров нормируйте оконную функцию на сумму её коэффициентов: *w_norm = w / sum(w)*.
Применение быстрого преобразования Фурье к сигналу

Быстрое преобразование Фурье (БПФ) в MATLAB реализуется функцией fft(), которая преобразует временной сигнал в частотную область с вычислительной сложностью O(N log N). Для корректного анализа частотного спектра необходимо учитывать параметры дискретизации: частота Найквиста равна половине частоты дискретизации (Fs/2), а разрешение по частоте определяется как Fs/N, где N – длина сигнала. Пример базового применения:
- Загрузите сигнал:
signal = load('data.mat').signal; - Вычислите БПФ:
fft_signal = fft(signal); - Получите односторонний спектр:
fft_single = abs(fft_signal(1:N/2+1))/N; - Создайте частотную ось:
f = Fs*(0:N/2)/N;
Для подавления шумов и выделения полезных компонент используйте оконные функции перед БПФ. Например, окно Ханна (hann(N)) снижает боковые лепестки на 60 дБ, но расширяет главный лепесток в 2 раза. Окно Блэкмана-Харриса (blackmanharris(N)) обеспечивает подавление до 92 дБ при расширении в 3 раза. Применение окна:
- Создайте окно:
window = hann(N, 'periodic'); - Умножьте сигнал на окно:
windowed_signal = signal .* window; - Выполните БПФ:
fft_windowed = fft(windowed_signal);
При анализе реальных сигналов часто возникают артефакты из-за утечки спектра. Для их минимизации выбирайте длину БПФ кратной степени двойки (например, 1024, 2048) и используйте перекрытие окон (50–75%) при сегментации сигнала. В MATLAB реализуйте это с помощью pwelch() для оценки спектральной плотности мощности с перекрытием: pwelch(signal, window, noverlap, N, Fs);, где noverlap – число перекрывающихся отсчетов.
Для точного определения частоты доминирующей компоненты используйте интерполяцию спектра. Метод параболической интерполяции по трем точкам вокруг пика позволяет достичь точности до 0.1% от разрешения по частоте. Пример реализации:
- Найдите индекс пика:
[~, idx] = max(abs(fft_signal)); - Возьмите соседние точки:
y = abs(fft_signal(idx-1:idx+1)); - Вычислите интерполированную частоту:
delta = 0.5*(y(3)-y(1))/(2*y(2)-y(1)-y(3)); - Уточните частоту:
f_peak = (idx + delta - 1) * Fs/N;
Поиск пиковых значений в спектре для определения частоты

Спектральный анализ сигнала в MATLAB начинается с преобразования временного ряда в частотную область. Для этого используется функция fft(), которая вычисляет дискретное преобразование Фурье (ДПФ). Результат – комплексный массив, модуль которого представляет амплитудный спектр. Чтобы получить физически интерпретируемые частоты, необходимо применить fftshift() и нормировать частотную ось с учетом частоты дискретизации Fs. Например, для сигнала с Fs = 1000 Гц и длиной N = 1024 отсчетов частотный шаг составит Fs/N ≈ 0.9766 Гц.
Пиковые значения в спектре соответствуют доминирующим частотам сигнала. Для их поиска используют функцию findpeaks(), которая выделяет локальные максимумы. Ключевые параметры:
'MinPeakHeight'– минимальная амплитуда пика (например,0.1 * max(spectrum)для фильтрации шума).'MinPeakDistance'– минимальное расстояние между пиками в отсчетах (полезно при близких гармониках).'Threshold'– пороговое значение для подавления ложных пиков.
Без настройки этих параметров алгоритм может выдать сотни нерелевантных максимумов.
При работе с реальными сигналами спектр часто содержит симметричные пики из-за свойств ДПФ. Чтобы избежать дублирования, анализируют только первую половину спектра (до частоты Найквиста Fs/2). Для сигнала с шумом рекомендуется предварительно применить оконную функцию (например, Ханна или Хэмминга) перед fft(), чтобы снизить эффект растекания спектра. Окно Ханна (hann(N)) уменьшает боковые лепестки на -31 дБ, но расширяет главный лепесток в 1.5 раза.
После выделения пиков их частоты определяют по индексам массива спектра. Если peaks – массив индексов пиков, а f – частотная ось, то доминирующие частоты вычисляются как f(peaks). Для повышения точности используют интерполяцию пиков параболическим методом:
- Выделяют три точки вокруг пика:
[i-1, i, i+1]. - Вычисляют коэффициенты параболы
a*x² + b*x + cпо методу наименьших квадратов. - Находят вершину параболы:
x_peak = -b/(2*a). - Корректируют частоту:
f_corrected = f(i) + (x_peak - i) * (f(2) - f(1)).
Этот метод снижает погрешность определения частоты до 0.1% при отношении сигнал/шум 20 дБ.
В задачах с несколькими гармониками важно учитывать кратность частот. Например, если основная частота 50 Гц, то пики на 100 Гц, 150 Гц и т.д. могут быть гармониками, а не независимыми компонентами. Для их разделения используют функцию gcd() (наибольший общий делитель) или анализируют фазовые соотношения между пиками. В MATLAB это реализуется через сравнение индексов пиков с округленными отношениями частот.
Для автоматизации процесса рекомендуется оформить поиск пиков в виде функции с параметрами:
- Вход: сигнал, частота дискретизации, порог амплитуды, минимальное расстояние между пиками.
- Выход: массив частот и амплитуд пиков, отсортированный по убыванию амплитуды.
Пример вызова: [freqs, amps] = find_spectrum_peaks(signal, Fs, 0.05, 5). Такая функция позволяет быстро адаптировать алгоритм под разные типы сигналов без изменения кода.
Визуализация результатов с помощью графиков и меток

В MATLAB для наглядного отображения частоты сигнала используйте функцию plot с параметрами, подчеркивающими ключевые точки. Например, после вычисления частоты через БПФ добавьте маркеры на график спектра: plot(f, abs(Y), ‘b-‘, f(peaks), abs(Y(peaks)), ‘ro’). Здесь ‘ro’ обозначает красные кружки в местах пиков, а f(peaks) – частоты, соответствующие максимальным амплитудам. Это сокращает время анализа, так как визуально выделяет доминирующие компоненты.
Для временных сигналов применяйте stem вместо plot, чтобы подчеркнуть дискретную природу данных. Команда stem(t, x, ‘filled’, ‘MarkerSize’, 4) отобразит отсчеты с заполненными маркерами, где ‘MarkerSize’ регулирует их размер. Добавьте метки осей: xlabel(‘Время, с’); ylabel(‘Амплитуда’). Если сигнал содержит шум, предварительно сгладьте его фильтром smoothdata с окном 5–10 точек.
При работе с несколькими сигналами используйте hold on и разные цвета линий. Например, для сравнения исходного и фильтрованного сигналов: plot(t, x, ‘k’); hold on; plot(t, x_filtered, ‘r—‘). Легенда legend(‘Исходный’, ‘Фильтрованный’) устранит неоднозначность. Для частотного анализа добавьте вертикальную линию на найденной частоте: xline(f_estimated, ‘g—‘, ‘Частота: ‘ + string(f_estimated) + ‘ Гц’). Это автоматически подпишет значение на графике.
В многооконных визуализациях разделите данные с помощью subplot. Пример: subplot(2,1,1); plot(t, x); subplot(2,1,2); plot(f, abs(Y)). Для выделения областей интереса используйте area с полупрозрачной заливкой: area(f(1:100), abs(Y(1:100)), ‘FaceAlpha’, 0.3). Это акцентирует низкочастотные компоненты. Сохраняйте графики в векторном формате PDF или EPS через print(‘-dpdf’, ‘spectrum.pdf’), чтобы избежать потери качества при масштабировании.
