Создание серого звукового шума с использованием Matlab/octave

Я могу создать розовый, коричневый, синий звуковой шум с помощью следующего фрагмента кода, выбрав другую переменную invfnorm для использования ниже, но как я могу создать серый шум?

%https://en.wikipedia.org/wiki/Colors_of_noise

mean_amp=mean(yamp_orig.^2); %get mean of all freq amplitudes
amt_of_freq=size(xfreq_orig,1); %number of freq

%invfnorm=1./[1:amt_of_freq]; % 1/f creates pink noise
%invfnorm=[1:amt_of_freq]; % f creates blue noise
invfnorm=1./[1:amt_of_freq].^2; % 1/f^2 creates brown noise

amp_1f_new=sqrt(mean_amp*invfnorm/sum(invfnorm))(:); %new noise amplitudes to use

В ссылке https://en.wikipedia.org/wiki/Colors_of_noise они дают формулы для розового, коричневого, синего звукового шума, но для серого шума они просто говорят, что это «перевернутая кривая A-взвешивания», не показывая формулу, мне просто нужна формула . см. спектр ниже.

Серый шум Веб-сайт, на котором я получил информацию об этом, находится здесь grey шум

Ps: я использую Octave 4.2.2, который похож на Matlab


person Rick T    schedule 06.06.2018    source источник
comment
В чем проблема со ссылкой на википедию? Я имею в виду, вы не понимаете описание? Вопрос выглядит так, как будто вы перестали работать в какой-то момент и просите нас закончить его. Я уверен, что это не так, но вы можете объяснить немного больше, почему вы застряли здесь.   -  person Ander Biguri    schedule 06.06.2018
comment
@AnderBiguri уверен, что в ссылке en.wikipedia.org/wiki/Colors_of_noise они дают формулы для розовый, коричневый, синий звуковой шум, но для серого носа просто скажите, что это перевернутая кривая A-взвешивания без формулы, мне просто нужна формула.   -  person Rick T    schedule 06.06.2018
comment
Но если вы нажмете на ссылку кривой A-взвешивания, там будут формулы... Вы просто не нажали на нее?   -  person Ander Biguri    schedule 06.06.2018
comment
@AnderBiguri да, он дает формулы, но ни одна из них не соответствует серому шуму на изображении выше.   -  person Rick T    schedule 06.06.2018
comment
перевернутая кривая A-взвешивания, а не кривая A-взвешивания   -  person Ander Biguri    schedule 06.06.2018
comment
@AnderBiguri похоже, что формулы серого шума на самом деле нет, но они основаны на кривых Флетчера-Мансона en.wikipedia.org/wiki/Fletcher%E2%80%93Munson_curves Мне нужно посмотреть, есть ли что-то близкое... Я думал, что это просто недостающая формула, но много факторов зайди в этот.   -  person Rick T    schedule 06.06.2018
comment
Я предполагаю, что вам просто нужно инвертировать любое из уравнений на странице википедии кривой A-взвешивания, чтобы получить новое уравнение.   -  person Ander Biguri    schedule 06.06.2018


Ответы (1)


Как вы упомянули, серый шум создается путем применения обратной кривой a-взвешивания.

Следующий фрагмент представляет собой пример Matlab (спасибо W. Owen Brimijoin) для создания серого шума:

%values from the ISO 66-phon Equal-loudness contour (adjusted for
        %optimal spline interpolation):
        freqs = [1 5 15 36 75 138 235 376 572 835 1181 1500 2183 2874 3718 ...
            4800 5946 7377 9051 10996 13239 15808 18735 22050].*sample_rate/44100;
        dB_vals = [61 61 56 40 25 17 11 7 5 4 6 8 3 1 1 4 9 14 17 16 10 5 2 1];

        %create level vector for use in inverse Fourier transform:
        freq = linspace(0,sample_rate/2,floor(num_samples/2));
        spl = spline(freqs,dB_vals,freq); %upsample 
        levels = [spl,fliplr(spl)]; %reflect vector
        levels = 10.^(levels'./10); %change to power
        levels(levels==inf) = 0; %remove infinite values
        phase_vals = rand(length(levels),1); %generate random phase vals
        %now apply an inverse fft:
        wave = real(ifft(sqrt(levels).*(cos(2*pi*phase_vals)+1i*sin(2*pi*phase_vals))));
        wave = wave./max(abs(wave));

Где levels = the inversed a-weighting array.

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

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

wave = real(ifft(sqrt(levels).*(cos(2*pi*phase_vals)+1i*sin(2*pi*phase_vals))));

Как указано в начале кода, здесь используется кривая 66 фонов, поэтому вам может потребоваться настроить массив dB_vals, если вы хотите использовать фон другого уровня.

Я нашел эту функцию весьма полезно для расчета различных фоновых кривых для взвешивания, если это необходимо.

person WoodyDev    schedule 07.06.2018