Update file. Add audiowrite

This commit is contained in:
Louis GRAZ 2024-03-25 11:50:44 +01:00
parent f4fdd1cb14
commit bc5cc1a126
1 changed files with 190 additions and 182 deletions

View File

@ -1,182 +1,190 @@
pkg load signal pkg load signal
% Load the audio signal % Load the audio signal
[signal, Fs] = audioread("Sound/modifiedmodulator.wav"); [signal, Fs] = audioread("Sound/modulator22.wav");
t = (0:length(signal)-1) / Fs; % Time vector t = (0:length(signal)-1) / Fs; % Time vector
% Design low-pass filter % Design low-pass filter
lpf_order = 30; lpf_order = 30;
lpf_cutoff_freq = 1000; % in Hz lpf_cutoff_freq = 1000; % in Hz
lpf_filter = fir1(lpf_order, lpf_cutoff_freq / (Fs/2)); lpf_filter = fir1(lpf_order, lpf_cutoff_freq / (Fs/2));
% Apply low-pass filter to the original signal % Apply low-pass filter to the original signal
filtered_signal_lpf = filter(lpf_filter, 1, signal); filtered_signal_lpf = filter(lpf_filter, 1, signal);
% Downsample the filtered signal using downsample() % Downsample the filtered signal using downsample()
downsampled_signal1 = downsample(filtered_signal_lpf, round(Fs/4000)); downsampled_signal1 = downsample(filtered_signal_lpf, round(Fs/4000));
% Downsample the filtered signal using decimate() % Downsample the filtered signal using decimate()
downsampled_signal2 = decimate(filtered_signal_lpf, round(Fs/4000)); downsampled_signal2 = decimate(filtered_signal_lpf, round(Fs/4000));
% Parameters for measurements % Write downsampled signals to audio files
num_measurements = 100; % Number of measurements audiowrite('downsampled_signal1.wav', downsampled_signal1, 4000);
durations_dft = zeros(1, num_measurements); audiowrite('downsampled_signal2.wav', downsampled_signal2, 4000);
durations_fft = zeros(1, num_measurements);
% Parameters for measurements
for i = 1:num_measurements num_measurements = 100; % Number of measurements
% Measure time taken for DFT durations_dft = zeros(1, num_measurements);
tic; durations_fft = zeros(1, num_measurements);
[power_dft, duration_dft] = frequencySpectrum(signal, Fs, false, false);
durations_dft(i) = duration_dft; for i = 1:num_measurements
% Measure time taken for DFT
% Measure time taken for FFT with padding tic;
tic; [power_dft, duration_dft] = frequencySpectrum(signal, Fs, false, false);
[power_fft, duration_fft] = frequencySpectrum(signal, Fs, true, false); durations_dft(i) = duration_dft;
durations_fft(i) = duration_fft;
end % Measure time taken for FFT with padding
tic;
% Calculate average and standard deviation [power_fft, duration_fft] = frequencySpectrum(signal, Fs, true, false);
avg_duration_dft = mean(durations_dft); durations_fft(i) = duration_fft;
std_dev_dft = std(durations_dft); end
avg_duration_fft = mean(durations_fft); % Calculate average and standard deviation
std_dev_fft = std(durations_fft); avg_duration_dft = mean(durations_dft);
std_dev_dft = std(durations_dft);
fprintf('Average duration for DFT: %f seconds\n', avg_duration_dft);
fprintf('Standard deviation for DFT: %f seconds\n', std_dev_dft); avg_duration_fft = mean(durations_fft);
fprintf('\n'); std_dev_fft = std(durations_fft);
fprintf('Average duration for FFT (with padding): %f seconds\n', avg_duration_fft);
fprintf('Standard deviation for FFT (with padding): %f seconds\n', std_dev_fft); fprintf('Average duration for DFT: %f seconds\n', avg_duration_dft);
fprintf('Standard deviation for DFT: %f seconds\n', std_dev_dft);
% Apply FIR filter fprintf('\n');
% Design FIR filter fprintf('Average duration for FFT (with padding): %f seconds\n', avg_duration_fft);
fir_order = 30; fprintf('Standard deviation for FFT (with padding): %f seconds\n', std_dev_fft);
cutoff_freq_fir = 1000; % in Hz
fir_filter = fir1(fir_order, cutoff_freq_fir / (Fs/2)); % Apply FIR filter
% Design FIR filter
% Apply FIR filter to the original signal fir_order = 30;
filtered_signal_fir = filter(fir_filter, 1, signal); cutoff_freq_fir = 1000; % in Hz
fir_filter = fir1(fir_order, cutoff_freq_fir / (Fs/2));
% Check FIR filter stability (FIR filters are always stable)
% Apply FIR filter to the original signal
% Apply IIR filter filtered_signal_fir = filter(fir_filter, 1, signal);
% Design Butterworth IIR filter
iir_order = 8; % Check FIR filter stability (FIR filters are always stable)
cutoff_freq_iir = 1000; % in Hz
[b, a] = butter(iir_order, cutoff_freq_iir / (Fs/2), 'low'); % Apply IIR filter
% Design Butterworth IIR filter
% Check IIR filter stability iir_order = 8;
iir_stable = all(abs(roots(a)) < 1); % Check if all poles are inside the unit circle cutoff_freq_iir = 1000; % in Hz
fprintf('IIR filter stability: %d\n', iir_stable); [b, a] = butter(iir_order, cutoff_freq_iir / (Fs/2), 'low');
% Apply IIR filter to the original signal % Check IIR filter stability
filtered_signal_iir = filter(b, a, signal); iir_stable = all(abs(roots(a)) < 1); % Check if all poles are inside the unit circle
fprintf('IIR filter stability: %d\n', iir_stable);
% Plot all signals and filtered signals on the same figure
figure; % Apply IIR filter to the original signal
filtered_signal_iir = filter(b, a, signal);
% Original Signal
subplot(4, 1, 1); % Plot all signals and filtered signals on the same figure
plot(t, signal); figure;
xlabel('Time (s)');
ylabel('Amplitude'); % Original Signal
title('Original Signal'); subplot(4, 1, 1);
plot(t, signal);
% Low-pass Filtered Signal xlabel('Time (s)');
subplot(4, 1, 2); ylabel('Amplitude');
plot(t, filtered_signal_lpf); title('Original Signal');
xlabel('Time (s)');
ylabel('Amplitude'); % Low-pass Filtered Signal
title('Low-pass Filtered Signal'); subplot(4, 1, 2);
plot(t, filtered_signal_lpf);
% Downsampled Signal using downsample() xlabel('Time (s)');
subplot(4, 1, 3); ylabel('Amplitude');
t_down1 = (0:length(downsampled_signal1)-1) / (Fs/4000); title('Low-pass Filtered Signal');
plot(t_down1, downsampled_signal1);
xlabel('Time (s)'); % Downsampled Signal using downsample()
ylabel('Amplitude'); subplot(4, 1, 3);
title('Downsampled Signal using downsample()'); t_down1 = (0:length(downsampled_signal1)-1) / (Fs/4000);
plot(t_down1, downsampled_signal1);
% Downsampled Signal using decimate() xlabel('Time (s)');
subplot(4, 1, 4); ylabel('Amplitude');
t_down2 = (0:length(downsampled_signal2)-1) / (Fs/4000); title('Downsampled Signal using downsample()');
plot(t_down2, downsampled_signal2);
xlabel('Time (s)'); % Downsampled Signal using decimate()
ylabel('Amplitude'); subplot(4, 1, 4);
title('Downsampled Signal using decimate()'); t_down2 = (0:length(downsampled_signal2)-1) / (Fs/4000);
plot(t_down2, downsampled_signal2);
xlabel('Time (s)');
% Plot filtered signals ylabel('Amplitude');
figure; title('Downsampled Signal using decimate()');
% FIR Filtered Signal
subplot(2, 1, 1); % Plot filtered signals
plot(t, filtered_signal_fir); figure;
xlabel('Time (s)');
ylabel('Amplitude'); % FIR Filtered Signal
title('FIR Filtered Signal'); subplot(2, 1, 1);
plot(t, filtered_signal_fir);
% IIR Filtered Signal xlabel('Time (s)');
subplot(2, 1, 2); ylabel('Amplitude');
plot(t, filtered_signal_iir); title('FIR Filtered Signal');
xlabel('Time (s)');
ylabel('Amplitude'); % IIR Filtered Signal
title('IIR Filtered Signal'); subplot(2, 1, 2);
plot(t, filtered_signal_iir);
% Display frequency response of FIR and IIR filters xlabel('Time (s)');
figure; ylabel('Amplitude');
title('IIR Filtered Signal');
% Frequency response of FIR filter
[h_fir, w_fir] = freqz(fir_filter, 1, 1024, Fs); % Display frequency response of FIR and IIR filters
subplot(2, 1, 1); figure;
plot(w_fir, 20*log10(abs(h_fir)));
xlabel('Frequency (Hz)'); % Frequency response of FIR filter
ylabel('Magnitude (dB)'); [h_fir, w_fir] = freqz(fir_filter, 1, 1024, Fs);
title('Frequency Response of FIR Filter'); subplot(2, 1, 1);
grid on; plot(w_fir, 20*log10(abs(h_fir)));
xlabel('Frequency (Hz)');
subplot(2, 1, 2); ylabel('Magnitude (dB)');
plot(w_fir, angle(h_fir)); title('Frequency Response of FIR Filter');
xlabel('Frequency (Hz)'); grid on;
ylabel('Phase (rad)');
title('Phase Response of FIR Filter'); subplot(2, 1, 2);
grid on; plot(w_fir, angle(h_fir));
xlabel('Frequency (Hz)');
% Frequency response of IIR filter ylabel('Phase (rad)');
[h_iir, w_iir] = freqz(b, a, 1024, Fs); title('Phase Response of FIR Filter');
figure; grid on;
subplot(2, 1, 1);
plot(w_iir, 20*log10(abs(h_iir))); % Frequency response of IIR filter
xlabel('Frequency (Hz)'); [h_iir, w_iir] = freqz(b, a, 1024, Fs);
ylabel('Magnitude (dB)'); figure;
title('Frequency Response of IIR Filter'); subplot(2, 1, 1);
grid on; plot(w_iir, 20*log10(abs(h_iir)));
xlabel('Frequency (Hz)');
subplot(2, 1, 2); ylabel('Magnitude (dB)');
plot(w_iir, angle(h_iir)); title('Frequency Response of IIR Filter');
xlabel('Frequency (Hz)'); grid on;
ylabel('Phase (rad)');
title('Phase Response of IIR Filter'); subplot(2, 1, 2);
grid on; plot(w_iir, angle(h_iir));
xlabel('Frequency (Hz)');
% Downsample filtered signals to 4000 Hz ylabel('Phase (rad)');
downsampled_filtered_signal_fir = downsample(filtered_signal_fir, round(Fs/4000)); title('Phase Response of IIR Filter');
downsampled_filtered_signal_iir = downsample(filtered_signal_iir, round(Fs/4000)); grid on;
% Compare downsampled filtered signals % Downsample filtered signals to 4000 Hz
figure; downsampled_filtered_signal_fir = downsample(filtered_signal_fir, round(Fs/4000));
downsampled_filtered_signal_iir = downsample(filtered_signal_iir, round(Fs/4000));
% FIR Filtered Signal (downsampled)
subplot(2, 1, 1); % Compare downsampled filtered signals
plot(t_down1, downsampled_filtered_signal_fir); figure;
xlabel('Time (s)');
ylabel('Amplitude'); % FIR Filtered Signal (downsampled)
title('FIR Filtered Signal (Downsampled)'); subplot(2, 1, 1);
plot(t_down1, downsampled_filtered_signal_fir);
% IIR Filtered Signal (downsampled) xlabel('Time (s)');
subplot(2, 1, 2); ylabel('Amplitude');
plot(t_down1, downsampled_filtered_signal_iir); title('FIR Filtered Signal (Downsampled)');
xlabel('Time (s)');
ylabel('Amplitude'); % IIR Filtered Signal (downsampled)
title('IIR Filtered Signal (Downsampled)'); subplot(2, 1, 2);
plot(t_down1, downsampled_filtered_signal_iir);
xlabel('Time (s)');
ylabel('Amplitude');
title('IIR Filtered Signal (Downsampled)');
% Write downsampled signals to audio files
audiowrite('downsampled_signal1.wav', downsampled_filtered_signal_fir, 4000);
audiowrite('downsampled_signal2.wav', downsampled_filtered_signal_iir, 4000);