Сгенерируйте дискретную синусоиду
The dsp.SineWave
Система object™ генерирует действительный или комплексный многоканальный синусоидальный сигнал с независимой амплитудой, частотой и фазой в каждом выходном канале.
Как для действительных, так и для сложных синусоидов, свойства Amplitude, Frequency и PhaseOffset могут быть скалярами или векторами N длины, где N - количество каналов в выходе. Когда вы задаете по крайней мере одно из этих свойств как вектор с N длиной, скалярные значения, заданные для других свойств, применяются к каждому из N каналов.
Чтобы сгенерировать синусоидальный сигнал в дискретном времени:
Создайте dsp.SineWave
Объекту и установите его свойства.
Вызывайте объект с аргументами, как будто это функция.
Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».
создает объект синусоиды, который генерирует действительную синусоиду с амплитудой 1, частотой 100 Гц и смещением фазы 0. По умолчанию объект синусоиды генерирует только одну выборку.sine
= dsp.SineWave
создает объект синусоиды с каждым заданным набором свойств до заданного значения. Заключайте каждое имя свойства в одинарные кавычки. sine
= dsp.SineWave(Name,Value
)
создает объект синусоиды с набором свойств Amplitude для sine
= dsp.SineWave(amp,freq,phase,Name,Value
)amp
, Частота набора свойств для freq
, PhaseOffset набора свойств чтобы phase
, и любые другие заданные свойства устанавливаются на заданные значения.
Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release
функция разблокирует их.
Если свойство настраивается, можно изменить его значение в любой момент.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.
Amplitude
- Амплитуда синусоидальной волны1
(по умолчанию) | скалярный вектор |Амплитуда синусоиды, заданная как одно из следующего:
скаляр -- скаляр применяется ко всем каналам.
вектор -- вектор N длины содержит амплитуды синусоид в каждом из N выходных каналов. Длина вектора должна совпадать с длиной вектора, заданной для свойств Frequency и PhaseOffset.
Настраиваемый: Да
Это свойство настраивается только, когда вы задаете значение Method 'Trigonometric function'
или 'Differential'
.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Frequency
- Частота синусоидальной волны100
(по умолчанию) | скалярный вектор |Частота синусоиды в Гц, заданная как одно из следующего:
скаляр -- скаляр применяется ко всем каналам.
вектор -- вектор N длины содержит частоты синусоид в каждом из N выходных каналов. Длина вектора должна совпадать с длиной, заданной для свойств Amplitude и PhaseOffset.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
PhaseOffset
- Смещение фазы синусоидальной волны0
(по умолчанию) | скалярный вектор |Смещение фазы синусоиды в радианах, заданное как одно из следующего:
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ComplexOutput
- Флаг, который указывает, является ли сигнал действительным или комплекснымfalse
(по умолчанию) | true
Флаг, который указывает, является ли сигнал действительным или комплексным, задается как:
false
- выходы формы волны действительны.
true
- выход сложен.
Method
- Метод, используемый для генерации синусоидов'Trigonometric function'
(по умолчанию) | 'Table lookup'
| 'Differential'
Метод, используемый для генерации синусоидов, задается как одно из следующего:
'Trigonometric function'
- Объект вычисляет синусоиду путем дискретизации функции непрерывного времени.
'Table lookup'
- Объект предварительно компилирует уникальные выборки каждой выходной синусоиды в начале симуляции и при необходимости вспоминает выборки из памяти.
'Differential'
-- Объект использует инкрементный алгоритм. Этот алгоритм вычисляет выходные выборки на основе выходных значений, вычисленных в предыдущем шаге расчета и предварительно вычисленных членов обновления.
TableOptimization
- Оптимизируйте таблицу значений синуса для скорости или памяти'Speed'
(по умолчанию) | 'Memory'
Оптимизируйте таблицу значений синуса для скорости или памяти, заданную как:
'Speed'
- Таблица содержит k элементов, где k количество входа образцов за один полный период синусоиды. Период каждой синусоиды должен быть целым числом, кратным 1/ Fs, где Fs значение свойства SampleRate. То есть каждый элемент свойства Frequency должен иметь вид Fs/ m, где m является целым числом, большим 1
.
'Memory'
- Таблица содержит k/4 элементы.
Это свойство применяется только при установке Method
свойство к 'Table lookup'
.
SampleRate
- Частота дискретизации выходного сигнала1000
(по умолчанию) | положительная скалярная величинаЧастота дискретизации выхода сигнала в Гц, заданная как положительная скалярная величина.
Пример: 44100
Пример: 22050
SamplesPerFrame
- Количество выборок на систему координат1
(по умолчанию) | положительное целое числоКоличество последовательных выборок из каждой синусоиды в буфер в выход системы координат, заданное как положительное целое число.
Пример: 1000
Пример: 5000
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
OutputDataType
- Тип данных выходного сигнала синусоидальной волны'double'
(по умолчанию) | 'single'
| 'Custom'
Тип данных синусоид выхода, заданный как 'double'
, 'single'
, или 'Custom'
.
CustomOutputDataType
- Выход слова и длин дробейnumerictype([],16)
(по умолчанию) | numerictype([],32,30)
Выход словосочетаний и дробей, заданных как автоматический числовой тип с размером слова 16.
Пример: численный тип ([], 32,30)
Пример: численный тип ([], 16,15)
Это свойство применяется только, когда вы задаете свойство Method равным 'Table lookup'
и свойство OutputDataType, для 'Custom'
.
sineOut
- Выход Sine waveВыход Sine wave, возвращенный как вектор или матрица. Свойство SamplesPerFrame определяет количество строк в выходной матрице. Если свойство Frequency или PhaseOffset является вектором, то длина вектора определяет количество столбцов (каналов) в выходной матрице. Если на Frequency
или PhaseOffset
свойства скаляром, тогда количество каналов в выходной матрице равняется 1.
OutputDataType наборов свойств тип данных выходов.
Типы данных: single
| double
| fi
Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj
, используйте следующий синтаксис:
release(obj)
Примечание. Если вы используете R2016a или более ранний релиз, замените каждый вызов объекта эквивалентным step
синтаксис. Для примера, obj(x)
становится step(obj,x)
.
Сгенерируйте синусоиду с амплитудой 2, частотой 10 Гц и начальной фазой 0.
sine1 = dsp.SineWave(2,10); sine1.SamplesPerFrame = 1000; y = sine1(); plot(y)
Сгенерируйте две синусоиды, смещенные фазой pi/2 радиан.
sine2 = dsp.SineWave; sine2.Frequency = 10; sine2.PhaseOffset = [0 pi/2]; sine2.SamplesPerFrame = 1000; y = sine2(); plot(y)
Этот пример показов, как lowpass фильтровать сигнал с шумом в MATLAB и визуализировать исходные и фильтрованные сигналы с помощью анализатора спектра. Для версии Simulink этого примера смотрите Системы Координат of a Noisy Sine Wave Signal in Simulink.
Задайте источник сигнала
Входной сигнал является суммой двух синусоид с частотами 1 кГц и 10 кГц. Частота дискретизации составляет 44,1 кГц.
Sine1 = dsp.SineWave('Frequency',1e3,'SampleRate',44.1e3); Sine2 = dsp.SineWave('Frequency',10e3,'SampleRate',44.1e3);
Создайте Lowpass фильтр
Lowpass конечная импульсная характеристика фильтр, dsp.LowpassFilter
, проектирует фильтр конечной импульсной характеристики lowpass минимального порядка, используя обобщенный алгоритм Remez конечной импульсной характеристики создания фильтра. Установите частоту полосы пропускания равную 5000 Гц, и частоту полосы остановки равную 8000 Гц. Значение неравномерности в полосе пропускания составляет 0,1 дБ, а затухание в полосе задерживания составляет 80 дБ.
FIRLowPass = dsp.LowpassFilter('PassbandFrequency',5000,... 'StopbandFrequency',8000);
Создайте спектральный анализатор
Установите спектральный анализатор, чтобы сравнить спектры степени исходных и фильтрованных сигналов. Спектральные модули являются dBm.
SpecAna = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum',false, ... 'SampleRate',Sine1.SampleRate, ... 'NumInputPorts',2,... 'ShowLegend',true, ... 'YLimits',[-145,45]); SpecAna.ChannelNames = {'Original noisy signal','Low pass filtered signal'};
Задайте выборки по системам координат
Этот пример использует обработку на основе фрейма, где данные обрабатываются по одной системе координат за раз. Каждая система координат данных содержит последовательные выборки из независимого канала. Основанная на кадрах обработка выгодна для многих приложений обработки сигналов, потому что вы можете обрабатывать несколько выборок сразу. Путем буферизации данных в системы координат и обработки мультисамповых кадров данных, можно улучшить вычислительное время алгоритмов обработки сигналов. Установите количество выборок на систему координат равным 4000.
Sine1.SamplesPerFrame = 4000; Sine2.SamplesPerFrame = 4000;
Фильтрация сигнала шумного Sine wave
Добавьте средний белый Гауссов шум со стандартным отклонением 0,1 к сумме синусоид. Фильтрация результатов с помощью конечная импульсная характеристика. Во время выполнения симуляции анализатор спектра показывает, что частоты выше 8000 Гц в исходном сигнале ослаблены. Полученный сигнал поддерживает пик на 1 кГц, потому что он падает в полосе пропускания фильтра lowpass.
for i = 1 : 1000 x = Sine1()+Sine2()+0.1.*randn(Sine1.SamplesPerFrame,1); y = FIRLowPass(x); SpecAna(x,y); end release(SpecAna)
Полосу пропускания фильтруют дискретный сигнал синусоиды, который состоит из трех синусоидов на частотах, 1 кГц, 10 кГц и 15 кГц.
Спроектируйте полосно-пропускной фильтр Конечную Импульсную Характеристику Equiripple, сначала создав объект спецификаций полосно-пропускающего фильтра, а затем разработав фильтр, используя эти спецификации.
Проектирование Полосового Фильтра
Создайте объект созданий фильтра с помощью fdesign.bandpass
.
bandpassSpecs = fdesign.bandpass('Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2', ... 1/4,3/8,5/8,6/8,60,1,60);
Список доступных методов проекта для этого объекта.
designmethods(bandpassSpecs)
Design Methods for class fdesign.bandpass (Fst1,Fp1,Fp2,Fst2,Ast1,Ap,Ast2): butter cheby1 cheby2 ellip equiripple kaiserwin
Чтобы спроектировать фильтр Equiripple, выберите 'equiripple'
.
bpFilter = design(bandpassSpecs,'equiripple','Systemobject',true)
bpFilter = dsp.FIRFilter with properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator: [1x37 double] InitialConditions: 0 Show all properties
Визуализация частотной характеристики проектируемого фильтра.
fvtool(bpFilter,'Fs',44100)
Создайте синусоидальный сигнал
Создайте сигнал, который является суммой трех синусоидов с частотами на 1 кГц, 10 кГц и 15 кГц. Инициализируйте анализатор спектра, чтобы просмотреть исходный сигнал и отфильтрованный сигнал.
Sine1 = dsp.SineWave('Frequency',1e3,'SampleRate',44.1e3,'SamplesPerFrame',4000); Sine2 = dsp.SineWave('Frequency',10e3,'SampleRate',44.1e3,'SamplesPerFrame',4000); Sine3 = dsp.SineWave('Frequency',15e3,'SampleRate',44.1e3,'SamplesPerFrame',4000); SpecAna = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum',false, ... 'SampleRate',Sine1.SampleRate, ... 'NumInputPorts',2,... 'ShowLegend',true, ... 'YLimits',[-240,45]); SpecAna.ChannelNames = {'Original noisy signal','Bandpass filtered signal'};
Фильтрация синусоидального сигнала
Фильтрация синусоидального сигнала с помощью полосно-пропускающего фильтра, который был разработан. Просмотрите исходный сигнал и отфильтрованный сигнал в анализаторе спектра. Тон при 1 кГц отфильтровывают и ослабляют. Тон с частотой 10 кГц не влияет, и тон с частотой 15 кГц незначительно ослабляется, потому что он появляется в переходной полосе фильтра.
for i = 1 : 1000 x = Sine1()+Sine2()+Sine3(); y = bpFilter(x); SpecAna(x,y); end release(SpecAna)
Синусоида реального времени в дискретном времени определяется как:
где A - амплитуда, f - частота в Гц, и
Комплексная синусоида определяется как:
Метод тригонометрической функции вычисляет синусоиду в i-м канале, yi, путем дискретизации непрерывной функции
с периодом Ts, где вы задаете Ts во шаге расчета.
В каждом шаге расчета алгоритм оценивает функцию синуса в соответствующем временном значении в течение первого цикла синусоиды. Ограничивая тригонометрические оценки первым циклом каждой синусоиды, алгоритм избегает неточности вычисления синуса очень больших чисел. Это ограничение также устраняет возможность разрыва во время расширенных операций, когда абсолютная переменная времени может переполниться. Поэтому этот способ избегает требований к памяти метода поиска таблицы за счет многих других операций с плавающей точкой.
Метод поиска таблицы предварительно компилирует уникальные выборки каждой выходной синусоиды в начале симуляции и при необходимости вспоминает выборки из памяти. Поскольку таблица с конечной длиной может быть построена только, когда все выходные последовательности повторяются, метод требует, чтобы период каждой синусоиды в выходе был равномерно делен на период дискретизации. То есть 1/( fiTs) = ki должно быть целым значением для каждого канала i = 1, 2,..., N.
Когда алгоритм оптимизирует таблицу значений синуса для Speed
таблица, построенная для каждого канала, содержит элементы ki. Когда оптимизация для Memory
таблица, построенная для каждого канала, содержит элементы ki/4.
Для длинных выходных последовательностей метод поиска таблицы требует гораздо меньше операций с плавающей точкой, чем любой из других методов. Однако способ может потребовать значительно большего объема памяти, особенно для высоких частот дискретизации (длинные таблицы). Этот метод рекомендуется для моделей, которые предназначены для эмуляции или генерации кода для оборудования DSP, которое должно быть оптимизировано для скорости выполнения.
Примечание
Интерполяционная таблица для этого объекта построена из значений с плавающей точностью с двойной точностью. Когда вы используете Table Lookup
режим расчета, максимальная точность, которую вы можете достичь в своем выходе, составляет 53 бита. Установка значения длины слова типа выхода данных более 53 бит не улучшает точность вашего выхода.
Дифференциальный метод использует инкрементный алгоритм. Этот алгоритм вычисляет выходные выборки на основе выходных значений, вычисленных в предыдущем шаге расчета (и предварительно вычисленных членов обновления), используя следующие тождества.
Уравнения обновления для синусоиды в i-м канале, yi, могут поэтому быть записаны в матричном виде как
где вы задаете Ts во шаге расчета. Поскольку Ts является постоянным, правая матрица является константой и может быть вычислена один раз в начале симуляции. Значение Aisin [2πfi (t+Ts) + ϕi] тогда вычислено из значений sin (2πfit +ϕi) и потому что (2πfit +ϕi) простым матричным умножением каждый раз ступают.
Этот режим предлагает уменьшенную вычислительную нагрузку, но подвержен дрейфу с течением времени из-за совокупной ошибки квантования. Поскольку метод не зависит от абсолютного значения времени, нет опасности разрыва во время расширенных операций, когда абсолютная переменная времени может переполниться.
Указания и ограничения по применению:
Этот объект не имеет настраиваемых свойств для генерации кода.
Смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.