Изменение спектра и нормализация.

John
Сообщения: 17
Зарегистрирован: 29 сен 2020, 17:57

Изменение спектра и нормализация.

Сообщение John »

Доброго времени суток!

У меня возник вопрос по поводу значения амлитуд спектра. Моя задача состоит в том чтобы создать спектр так чтобы при обратном ПФ амплитуда сигнала была единична. Приведу пример:
  1. Создаем 2 массива амплитуд и фаз;
  2. В массив амлитуд записываем шум (к примеру шум Перлина, или белый шум);
  3. В массив фаз также пишем шум;
  4. Создаем симметричный спектр в прямоугольных координатах на основе массивов амплитуд и фаз (обнуляя 1 и FFTSize/2 мнимые значения);
  5. Делаем ОБПФ;
  6. На выходе должен получится сигнал с единичной амплитудой.
У меня на выходе получается единичный импульс вместо шума (шум есть, но он имеет слишком малую амплитуду).

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Изменение спектра и нормализация.

Сообщение Бахурин Сергей »

Проведите код чтобы посмотреть

John
Сообщения: 17
Зарегистрирован: 29 сен 2020, 17:57

Re: Изменение спектра и нормализация.

Сообщение John »

Код:
  1.  
  2.  
  3. ' Основной код
  4.  
  5. Private Sub Form_Load()
  6.  
  7.  
  8.  
  9.     . . .
  10.  
  11.  
  12.  
  13.     InitSoundFromFile "C:\temp\test_spin.wav"
  14.  
  15.    
  16.  
  17.     DrawSpectrum picSpectrumOrigin, m_fSpectrum, m_cWavFile.SampleRate
  18.  
  19.  
  20.  
  21.     Randomize 1, 1  ' // Шум в амлитуды и фазы
  22.  
  23.  
  24.  
  25.     IFFT
  26.  
  27.    
  28.  
  29.     DrawSpectrum picSpectrumModified, m_fSpectrum, m_cWavFile.SampleRate
  30.  
  31.     DrawWaveform picWaveForm, m_fSamples, m_cWavFile.SampleRate
  32.  
  33.    
  34.  
  35. End Sub
  36.  
  37.  
  38.  
  39. ' Шум/сигнал
  40.  
  41. Private Sub Randomize( _
  42.  
  43.             ByVal fMagnitude As Single, _
  44.  
  45.             ByVal fPhase As Single)
  46.  
  47.     Dim lIndex  As Long
  48.  
  49.     Dim fMag    As Single
  50.  
  51.     Dim fPh     As Single
  52.  
  53.  
  54.  
  55.     For lIndex = 0 To m_cFFT.FFTSize \ 2
  56.  
  57.        
  58.  
  59.         fMag = Rnd / (m_cFFT.FFTSize / 2)
  60.  
  61.         fPh = Rnd / (m_cFFT.FFTSize / 2)
  62.  
  63.        
  64.  
  65.         m_fSpectrum(0, lIndex) = fMag * fMagnitude + (1 - fMagnitude) * m_fSpectrum(0, lIndex)
  66.  
  67.         m_fSpectrum(1, lIndex) = fPh * fPhase + (1 - fPhase) * m_fSpectrum(1, lIndex)
  68.  
  69.        
  70.  
  71.     Next
  72.  
  73.    
  74.  
  75. End Sub
  76.  
  77.  
  78.  
  79. Private Sub IFFT()
  80.  
  81.     Dim fRectSpectrum() As Single
  82.  
  83.     Dim lIndex          As Long
  84.  
  85.     Dim lFFTSize        As Long
  86.  
  87.    
  88.  
  89.     lFFTSize = UBound(m_fSpectrum, 2) * 2
  90.  
  91.    
  92.  
  93.     ReDim fRectSpectrum(1, lFFTSize - 1)
  94.  
  95.    
  96.  
  97.     For lIndex = 0 To UBound(m_fSpectrum, 2)
  98.  
  99.        
  100.  
  101.         fRectSpectrum(0, lIndex) = Cos(m_fSpectrum(1, lIndex)) * m_fSpectrum(0, lIndex)
  102.  
  103.         fRectSpectrum(1, lIndex) = Sin(m_fSpectrum(1, lIndex)) * m_fSpectrum(0, lIndex)
  104.  
  105.        
  106.  
  107.     Next
  108.  
  109.    
  110.  
  111.     For lIndex = 1 To lFFTSize - 1
  112.  
  113.    
  114.  
  115.         fRectSpectrum(0, lFFTSize - lIndex) = fRectSpectrum(0, lIndex)
  116.  
  117.         fRectSpectrum(1, lFFTSize - lIndex) = -fRectSpectrum(1, lIndex)
  118.  
  119.        
  120.  
  121.     Next
  122.  
  123.    
  124.  
  125.     fRectSpectrum(1, 0) = 0
  126.  
  127.     fRectSpectrum(1, lFFTSize \ 2) = 0
  128.  
  129.    
  130.  
  131.     m_cFFT.IFFTR fRectSpectrum(), m_fSamples
  132.  
  133.    
  134.  
  135.     Debug.Print m_fSamples(0)
  136.  
  137.    
  138.  
  139. End Sub
  140.  
  141.  
Результат - первый семпл 0.99 - остальные шум, но очень тихий:

Изображение

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Изменение спектра и нормализация.

Сообщение Бахурин Сергей »

Выяснилось, что я языками не владею. Покажите спектр который подается на iffy

John
Сообщения: 17
Зарегистрирован: 29 сен 2020, 17:57

Re: Изменение спектра и нормализация.

Сообщение John »

Прикладываю файлы.
Spectrum.zip
(115.52 КБ) 147 скачиваний

John
Сообщения: 17
Зарегистрирован: 29 сен 2020, 17:57

Re: Изменение спектра и нормализация.

Сообщение John »

Удалось победить проблему одиночного импульса - сделал вариацию фазы не от 0 до 1, а от -pi до pi. Проблема нормализации амплитуды осталась.

Как добавить шум нужной амплитуды в частотной области? Как рассчитать амплитуду?

Ответить