Восстановить сигнал после установления порога? - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу восстановить 1D аудиосигнал, установив пороговые значения вейвлет-коэффициентов.Прежде всего, я прочитал звуковой сигнал и нормализовал его.После этого я добавил белый гауссовский шум.Впоследствии я вычислил максимальный уровень громкости для разложения.

Я применил многоуровневое вейвлет-разложение к шумному сигналу с помощью вейвлета db8 и получил приблизительные и подробные коэффициенты.Для расчета порога с использованием universal threshold formula я получил пороговое значение для жесткого порога и применил этот порог к коэффициентам вейвлета.В конце я использую waverec для восстановления исходного сигнала с использованием новых коэффициентов.

clear all
close all
clc

[x,Fs] = audioread('audio8.wav');   %Read cough sound
sound(x,Fs)
figure
plot(x(1:end,1))
grid on
title('Original Cough Sound')
xlabel('Frequency (Hz)')
ylabel('Amplitude')

x = x/abs(max(x));             %Normalization of Cough Sound
normalized_snr = snr(x,Fs);    %SNR of Normalized Cough Sound
figure
plot(x)
grid on
title('Normalized Cough Sound')
xlabel('Frequency (Hz)')
ylabel('Amplitude')

gauss_noise = awgn(x,20,'measured');  %Adding White Gaussian Noise
sound(gauss_noise,Fs)
noisy_snr = snr(gauss_noise,Fs);     %SNR of Noisy Cough Sound
figure
plot(gauss_noise)
grid on
title('Noisy Cough Sound')
xlabel('Frequency (Hz)')
ylabel('Amplitude')

len = length(gauss_noise);
disp(len)

level = fix(log2(len));
disp(level)

wn = 'db8';
[c,l] = wavedec(gauss_noise,level,wn);

%calculate threshold
sigma = median(abs(c))/0.6745;
thresh = sqrt(2*log(length(gauss_noise)))*sigma;
disp(thresh)

for i = 1:level

    det = detcoef(c,l,i);
    y_det_hard = wthresh(det,'h',thresh);
    figure
    plot(y_det_hard)
    grid on

end

for j = 1:level

    app = appcoef(c,l,'db8',j);
%     y_app_hard = wthresh(app,'h',thresh);
    figure
    plot(app)
    grid on

 end

 app_last = appcoef(c,l,'db8',level);
 app_last_hard = wthresh(app_last,'h',thresh);
 disp(app_last_hard)
 figure 
 plot(app_last_hard)
 grid on

 new_coeff = [app_last_hard + y_det_hard];
 len2 = length(new_coeff);
 y_rec = waverec(new_coeff,len2,'db8'); %Perform wavelet reconstruction on new coefficients after thresholding 
 figure
 plot(y_rec)
 grid on

Я получаю сообщение об ошибке, которое ожидало, что N будет скаляром со значением <= -1.Правильно ли я применил порог к вейвлет-коэффициентам?И почему я не могу восстановить сигнал?

...