John
Сообщения: 17 Зарегистрирован: 29 сен 2020, 17:57
Сообщение
John » 13 июл 2021, 15:18
Доброго времени суток!
У меня возник вопрос по поводу значения амлитуд спектра. Моя задача состоит в том чтобы создать спектр так чтобы при обратном ПФ амплитуда сигнала была единична. Приведу пример:
Создаем 2 массива амплитуд и фаз;
В массив амлитуд записываем шум (к примеру шум Перлина, или белый шум);
В массив фаз также пишем шум;
Создаем симметричный спектр в прямоугольных координатах на основе массивов амплитуд и фаз (обнуляя 1 и FFTSize/2 мнимые значения);
Делаем ОБПФ;
На выходе должен получится сигнал с единичной амплитудой.
У меня на выходе получается единичный импульс вместо шума (шум есть, но он имеет слишком малую амплитуду).
John
Сообщения: 17 Зарегистрирован: 29 сен 2020, 17:57
Сообщение
John » 13 июл 2021, 15:34
Код:
' Основной код
Private Sub Form_Load()
. . .
InitSoundFromFile "C:\temp\test_spin.wav"
DrawSpectrum picSpectrumOrigin, m_fSpectrum, m_cWavFile.SampleRate
Randomize 1, 1 ' // Шум в амлитуды и фазы
IFFT
DrawSpectrum picSpectrumModified, m_fSpectrum, m_cWavFile.SampleRate
DrawWaveform picWaveForm, m_fSamples, m_cWavFile.SampleRate
End Sub
' Шум/сигнал
Private Sub Randomize( _
ByVal fMagnitude As Single , _
ByVal fPhase As Single )
Dim lIndex As Long
Dim fMag As Single
Dim fPh As Single
For lIndex = 0 To m_cFFT.FFTSize \ 2
fMag = Rnd / (m_cFFT.FFTSize / 2)
fPh = Rnd / (m_cFFT.FFTSize / 2)
m_fSpectrum(0, lIndex) = fMag * fMagnitude + (1 - fMagnitude) * m_fSpectrum(0, lIndex)
m_fSpectrum(1, lIndex) = fPh * fPhase + (1 - fPhase) * m_fSpectrum(1, lIndex)
Next
End Sub
Private Sub IFFT()
Dim fRectSpectrum() As Single
Dim lIndex As Long
Dim lFFTSize As Long
lFFTSize = UBound (m_fSpectrum, 2) * 2
ReDim fRectSpectrum(1, lFFTSize - 1)
For lIndex = 0 To UBound (m_fSpectrum, 2)
fRectSpectrum(0, lIndex) = Cos(m_fSpectrum(1, lIndex)) * m_fSpectrum(0, lIndex)
fRectSpectrum(1, lIndex) = Sin(m_fSpectrum(1, lIndex)) * m_fSpectrum(0, lIndex)
Next
For lIndex = 1 To lFFTSize - 1
fRectSpectrum(0, lFFTSize - lIndex) = fRectSpectrum(0, lIndex)
fRectSpectrum(1, lFFTSize - lIndex) = -fRectSpectrum(1, lIndex)
Next
fRectSpectrum(1, 0) = 0
fRectSpectrum(1, lFFTSize \ 2) = 0
m_cFFT.IFFTR fRectSpectrum(), m_fSamples
Debug.Print m_fSamples(0)
End Sub
Результат - первый семпл 0.99 - остальные шум, но очень тихий:
Бахурин Сергей
Администратор
Сообщения: 1116 Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:
Сообщение
Бахурин Сергей » 13 июл 2021, 15:41
Выяснилось, что я языками не владею. Покажите спектр который подается на iffy
John
Сообщения: 17 Зарегистрирован: 29 сен 2020, 17:57
Сообщение
John » 13 июл 2021, 22:20
Удалось победить проблему одиночного импульса - сделал вариацию фазы не от 0 до 1, а от -pi до pi. Проблема нормализации амплитуды осталась.
Как добавить шум нужной амплитуды в частотной области? Как рассчитать амплитуду?