Перейти к содержанию
    

Генератор сигналов с шумом

Осваиваю DSP в Matlab.

 

Для дальнейшего движения вперёд хочу создать/найти функцию, которая генерит сигнал - набор синусоид с заданным уровнем, а таже подмешивает шум. Всё показалось простым до того момента как дело дошло до проверки сгенерированного сигнала на спектре.

 

Основной вопрос - как правильно рассчитать амплитуду генерируемого шума, чтобы потом на спектре увидеть ровно тот самый SNR, что задавался в качестве параметра.

Пытаясь создать такую функцию, я столкнулся со следующими проблемами/нюансами:

 

1. Расчёт амплитуды генерируемого шума.

2. Точное построение спектра сигнала. Как учитывать следующие факторы:

- уменьшение энергии сигнала при домножении на оконную функцию

- нормализация спектра учитывая длину выборки (как сохранить и нужно ли энергию сигнала). Необходимо ли учитывать теорему Парсеваля?

- как учитывать различие комплексного и вещественного сигналов? Например, понятно, что если сигнал вещественный, то спектр его будет симметричным. Поэтому практически все примеры выводят только половину спектра, но энергия-то содержится в обоих частях спектра?

- каково влияние числа точек FFT на уровень шума в спектре: 10log10(N/2) либо 10log10(sqrt(N))?

 

И уже совсем примитивный вопрос: никак не удаётся сгенерить сигнал размахом в 1 и увидеть его на спектре на уровне 0db.

 

Разъясните, пожалуйста, эти вопросы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну по порядку

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

std, cov и тп (см statisicы toolbox)

2 окном одинаково ослабляется и сигнал и шум

3 если сигнал комплексный, то пусть и шум будет комплексный noise= hilbert(noise); а если вещественный коль спектр симметричный, то выводится его половина, можно и весь вывести.

4 для построения спектральных хар-к используйте ф-ии типа periodogramm, pburg и т.п.

от числа точек в fft уровень шума поменяться не может, при увеличении числа точек в fft без увеличения числа отчетов что-либо практически полезное вряд ли удастся (см статью fft zoom на форуме), а так можно только попытаться уменьшить эффект "растекания" спектров, что достигается вдобавок окнами

5 если генерировать сигнал с размахом в 1, то это должен быть сигнал одной! частоты, тогда можно пытаться что-то увидеть, если это не синус, а суммас синусов или шум, то этого не сделать в принципе

 

PS почитайте немного лекции про бпф, теорию случ. сигналов, а еще лучше совместите это с чтением чего нить типа "обработка сигналов в матлаб" или "цос в матлаб". это не издевка и не шутка, а чисто житейский совет))) ибо сам я задавал подобные вопросы, задаю и буду задавать, но приоритет должен быть у литературы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В добавление к shf_05: у шума нет такого параметра, как амплитуда. Есть среднеквадратическое отклонение, квадрат которого и равен мощности шума (при 0-вой постоянной составляющей).

Мощность гармонического сигнала = Um*Um/2, где Um - амплитуда гармоничесого сигнала (ГС).

Итак: генерим ГС заданной амплитуды (мощности), примешиваем к нему шум с требуемым СКО. Получаем требуемое ОСШ (SNR).

Если подмешивать несколько ГС, то мощность соответственно наращивается.

Для моделирования подходят все указанные программы. Я пользовался SpectraPlus (или можно еще CoolEdit) - это программы для работы со звуком, в которых 0чень просто можно смотреть все эти параметры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если подмешивать несколько ГС, то мощность соответственно наращивается.

Для моделирования подходят все указанные программы. Я пользовался SpectraPlus (или можно еще CoolEdit) - это программы для работы со звуком, в которых 0чень просто можно смотреть все эти параметры.

 

самое оптимальное не мой взгляд- матлаб, тут безграничные возможности в цос, а все эти параметры тоже можно увидеть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну по порядку

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

std, cov и тп (см statisicы toolbox)

Да, но вот как раз и интересно, на какую дисперсию нужно домножить, чтобы получить нужный SNR.

 

 

2 окном одинаково ослабляется и сигнал и шум

Нужно ли при этом компенсировать это ослабление, домножая сигнал на какую-то величину? Как она рассчитывается?

 

от числа точек в fft уровень шума поменяться не может, при увеличении числа точек в fft без увеличения числа отчетов что-либо практически полезное вряд ли удастся (см статью fft zoom на форуме), а так можно только попытаться уменьшить эффект "растекания" спектров, что достигается вдобавок окнами

Я и имею ввиду не просто количество точек fft, а количество точек в выборке. К примеру, генерируем сигнал с уровнем A, добавляем шум. Но ведь при этом увидим разлчиный SNR на спектре, если сгенерируем раздичное число точек выборки (и, соответственно, fft сделаем на то же число точек)?

 

5 если генерировать сигнал с размахом в 1, то это должен быть сигнал одной! частоты, тогда можно пытаться что-то увидеть, если это не синус, а суммас синусов или шум, то этого не сделать в принципе

В Матлабе при генерации сигнала без шума получаю интересный эффект: во-первых, сигнал этот не достигает уровня 0 db и его уровень зависит от частоты. Есть предположение, что такой эффект получается из-за того, что полосы частот fft дискретны и чем ближе частот к границе "бинов", тем меньше должен быть уровень этой частоты. Верно ли это, либо причина в другом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, но вот как раз и интересно, на какую дисперсию нужно домножить, чтобы получить нужный SNR.

Нужно ли при этом компенсировать это ослабление, домножая сигнал на какую-то величину? Как она рассчитывается?

Я и имею ввиду не просто количество точек fft, а количество точек в выборке. К примеру, генерируем сигнал с уровнем A, добавляем шум. Но ведь при этом увидим разлчиный SNR на спектре, если сгенерируем раздичное число точек выборки (и, соответственно, fft сделаем на то же число точек)?

В Матлабе при генерации сигнала без шума получаю интересный эффект: во-первых, сигнал этот не достигает уровня 0 db и его уровень зависит от частоты. Есть предположение, что такой эффект получается из-за того, что полосы частот fft дискретны и чем ближе частот к границе "бинов", тем меньше должен быть уровень этой частоты. Верно ли это, либо причина в другом?

 

SNR= signal/noise, мощность сигнала вам известна, мощность шума равна дисперсии в квадрате, ее не надо расчитывать!- задайте какую надо

 

если длина шума и длина сигнала равна, то от длины соотношение не зависит, если чтобы спектр таки был на 0 дБ, то пронормируйте его (самое простое - Sp=Sp./max(Sp)), где Sp- модуль спектра

а вообще чтобы не изобретать велосипед используйте periodogram и функции ее класса

 

почитайте про эффектр растекания спектра при несовпадении Fsignal и Fsample/N.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...