Как использовать компьютер в качестве генератора сигналов произвольной формы
Узнайте, как ваш компьютер может работать в качестве генератора сигналов произвольной формы. В данной статье мы будем использовать Scilab для генерирования цифровых сигналов, которые могут быть преобразованы в аналоговые сигналы с помощью звукового аппаратного обеспечения компьютера.
В последнее время я пишу статьи, которые демонстрируют использование Scilab для различных задач обработки сигналов. Эксперименты с DSP в такой вычислительной среде чрезвычайно удобны; алгоритмы, используемые в системах связи, датчиках и аудиосистемах, могут быть быстро разработаны и усовершенствованы, а сигналы могут быть тщательно проанализированы во временной и частотной областях.
Следующий шаг – расширить всю эту деятельность по обработке сигналов в область реальных сигналов напряжения, и Scilab делает выполнение этого очень простым (я предполагаю, что ваш компьютер может воспроизводить звук). В настоящее время у меня нет доступа к MATLAB, но я предполагаю, что он обеспечивает эквивалентные функциональные возможности, поэтому я надеюсь, что почти всё в этой статье будет актуально и для пользователей MATLAB. Существует еще одна бесплатная альтернатива MATLAB под названием GNU Octave. Я никогда не использовал его, поэтому я был бы признателен за любые отзывы пользователей Octave о том, как в нем реализовать операции преобразования цифры в аналог, обсуждаемые в этой и следующей статьях.
Вероятно, существует довольно много способов использовать эти возможности преобразования Scilab в аналог (или MATLAB в аналог). Один из вариантов использования, который приходит на ум, – это тестирование высокочастотной части беспроводного передатчика путем генерирования модулирующих сигналов основной полосы частот в Scilab и преобразования их в аналоговые сигналы, которые подаются на радиочастотную схему. В данной статье мы остановимся на более общем приложении: использование типового компьютера в качестве генератора сигналов произвольной формы.
Прежде чем перейти к основной части статьи, взгляните на предыдущие статьи по этой теме, чтобы ознакомиться с контекстом обсуждения.
Предыдущие статьи о цифровой обработке сигналов в Scilab
- Основы цифровой обработки сигналов (ЦОС, DSP) для синусоидальных сигналов с Scilab
- Как выполнить анализ в частотной области с помощью Scilab
- Как использовать Scilab для анализа амплитудно-модулированных РЧ сигналов
- Как использовать Scilab для анализа частотно-модулированных РЧ сигналов
- Как выполнить частотную модуляцию оцифрованным аудиосигналом с помощью Scilab
- Цифровая обработка сигналов в Scilab: как удалить шум в аудиозаписи с помощью фильтров обработки звука
- Обработка звука в Scilab: как реализовать спектральное вычитание
- Цифровая обработка сигналов в Scilab: как декодировать сигнал частотной манипуляции
- Цифровая обработка сигналов в Scilab: понятие фазового рассогласования при декодировании частотной манипуляции (FSK)
- Как использовать I/Q сигналы для создания надежного декодера частотной манипуляции (FSK)
- Как обработать I/Q сигналы в программно определяемом радиоприемнике (SDR)
Базовая система
Единственное, что вам нужно из дополнительного аппаратного обеспечения, – это аудиокабель с разъемами на обоих концах. Один конец подключается к разъему наушников на компьютере, а второй конец подает сигнал на соответствующую схему (или на осциллограф). На следующей фотографии показано, как я подключил пробник осциллографа Tektronix к аудиоразъему.

Команда, которую мы будем использовать для генерирования аналоговых сигналов, называется sound()
. Её единственный обязательный входной аргумент – это массив чисел, который вы хотите отправить на звуковой цифро-аналоговый преобразователь. Значения в этом массиве должны быть больше или равны –1 и меньше или равны +1. Это удобно, если вы работаете с синусоидальными сигналами, потому что функции sin()
и cos()
генерирую сигналы в этом диапазоне. Однако, в целом, вам необходимо знать амплитуды вашего сигнала и масштабировать их в диапазон [–1,1] по мере необходимости.
Функция sound()
также принимает аргумент для необходимой частоты дискретизации. Если вы не указываете частоту дискретизации, то она использует значение по умолчанию, которое составляет 22,05 кГц.
Пока мы говорим о частоте дискретизации, я должен упомянуть о серьезном ограничении, которое затрагивает любые попытки использовать звуковое оборудование компьютера в качестве генератора сигналов. Это аппаратное обеспечение предназначено для аудиосигналов, и, следовательно, его максимальная частота дискретизации была выбрана в соответствии с качеством звука, которое должно обеспечиваться аппаратным обеспечением. У меня сложилось впечатление, что в настоящее время многие компьютеры поддерживают частоты дискретизации до 192 кГц, но четкую информацию по этому вопросу найти трудно.
Генерирование синусоиды
Давайте начнем с простого примера. Мы сгенерируем синусоиду 441 Гц и рассмотрим некоторые осциллограммы.
SignalFrequency = 441;
SamplingFrequency = 22.05e3;
Samples_per_Cycle = SamplingFrequency/SignalFrequency;
n = 0:(Samples_per_Cycle-1);
Signal_OneCycle = sin(2*%pi*n / (SamplingFrequency/SignalFrequency));
Массив n
, и следовательно, и массив Signal_OneCycle
, имеет длину 50. Период сэмплирования составляет 1/22050 ≈ 45 мкс. Таким образом, один период сигнала длится приблизительно 50 × 45 мкс = 2.25 мс. Я предпочитаю, чтобы общая продолжительность составляла примерно 10 секунд, чтобы у меня было достаточно времени, чтобы посмотреть на сигнал на осциллографе. Следующий цикл for
используется для расширения массива Signal_OneCycle
до массива, длина которого соответствует требуемой длительности сигнала.
CycleDuration = (1/SamplingFrequency) * length(n);
FullSignal = 0;
for k=1:(10/CycleDuration)
> FullSignal = [FullSignal Signal_OneCycle];
> end
Теперь мы готовы генерировать сигнал. Нам не нужно указывать частоту дискретизации, потому что частота дискретизации, которую я использовал (22,05 кГц) равна значению по умолчанию.
sound(FullSignal)
Следующая осциллограмма показывает сгенерированный сигнал. Внизу мы можете увидеть измерения размаха (пик-пик) сигнала и частоты. Амплитуда сигнала, взятого напрямую с разъема наушников, вероятно, будет достаточной для многих приложений; если вам нужно более высокое напряжение, то будет достаточно простой схемы на операционном усилителе.

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



Генерирование треугольного сигнала
Следующие команды могут использоваться для генерирования треугольного сигнала. Мы будем использовать ту же частоту (т.е. 441 Гц), то есть длину в 25 выборок.
LowerLimit = -1;
UpperLimit = 1;
StepSize = (UpperLimit - LowerLimit)/(length(n)/2);
UpwardRamp = LowerLimit:StepSize:(UpperLimit - StepSize);
DownwardRamp = UpperLimit:-StepSize:(LowerLimit + StepSize);
TriangleWave_OneCycle = [UpwardRamp DownwardRamp];
TriangleWave_Full = -1;
for k=1:(10/CycleDuration)
> TriangleWave_Full = [TriangleWave_Full TriangleWave_OneCycle];
> end
sound(TriangleWave_Full)

Прежде чем мы закончим, я хочу отметить, что эта система обеспечивает не только удобное управление амплитудой, но и быструю настройку частоты: вы можете изменить частоту аналогового сигнала, не изменяя цифровые значения, а указав другую частоту дискретизации при вызове функции sound()
. Например, если указанная частота дискретизации выше исходной частоты дискретизации в 2 раза, то новая частота сигнала будет выше, чем исходная частота, в 2 раза.
sound(TriangleWave_Full, SamplingFrequency*2)

sound(TriangleWave_Full, SamplingFrequency/2)

Заключение
Мы обсудили простой способ, который использует Scilab (или MATLAB), чтобы превратить обычный компьютер в генератор сигналов произвольной формы. В данной статье представлены команды Scilab для генерирования синусоидального и треугольного сигналов, а в следующей статье мы рассмотрим другие типы сигналов.