| @@ -0,0 +1,146 @@ | |||
| function custom_filter_design_tool_4() | |||
| f = input('Enter the frequency (in Hz): '); | |||
| if f >= 1000 | |||
| [Fpass, Fstop, Wpass, Wstop, N, dens] = set_values_forxxx(f); | |||
| filter_type = 'firpm'; | |||
| else | |||
| [Fpass, Fstop, Wpass, Wstop, N, dens] = set_values_yy(f); | |||
| filter_type = 'firls'; | |||
| end | |||
| Fs = 40000; | |||
| % Filter design based on parameters | |||
| if f < 1000 | |||
| b = firls(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop]); | |||
| else | |||
| b = firpm(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop], dens); | |||
| end | |||
| % Display the filter type | |||
| disp(['Filter Type: ' filter_type]); | |||
| % Initialize the frequency step | |||
| step_size = input('Enter the frequency step size (50 or 100 Hz): '); | |||
| if step_size ~= 50 && step_size ~= 100 | |||
| error('Invalid step size. Please enter either 50 or 100 Hz.'); | |||
| end | |||
| % Compute magnitude at the given frequency and iterate until the nearest multiple of the step size | |||
| while mod(f, step_size) ~= 0 | |||
| if f > (f - mod(f, step_size)) | |||
| f = f - step_size; | |||
| else | |||
| f = f + step_size; | |||
| end | |||
| end | |||
| while true | |||
| [magnitude_dB,last_Fpass,Fstop_last, Wpass_Last,Wstop_last, c] = compute_magnitude_at_frequency(b, f, Fs, N, Fpass, Fstop, Wpass, Wstop, dens); | |||
| disp(['Magnitude at ' num2str(f) ' Hz: ' num2str(magnitude_dB) ' dB']); | |||
| disp(['Last value of Wpass: ', num2str(Wpass_Last)]); | |||
| disp(['Last value of Wstop: ', num2str(Wstop_last)]); | |||
| disp(['Last value of Fstop(Hz): ', num2str(Fstop_last)]); | |||
| disp(['Last value of Fpass(Hz): ', num2str(last_Fpass)]); | |||
| % Plot magnitude response | |||
| figure; | |||
| freqz(c, 1, 1024, Fs); | |||
| filename = sprintf('filter_coefficients_6_%dHz_%s.txt', f, filter_type); | |||
| save_filter_coefficients(filename, c); | |||
| % Update frequency for the next iteration | |||
| f = f - step_size; | |||
| if f <= 0 | |||
| break; | |||
| end | |||
| end | |||
| end | |||
| function save_filter_coefficients(filename, c) | |||
| fid = fopen(filename, 'wt'); | |||
| fprintf(fid, '%f\n', c); | |||
| fclose(fid); | |||
| disp(['Filter coefficients saved to ' filename]); | |||
| end | |||
| function [Fpass, Fstop, Wpass, Wstop, N, dens] = set_values_forxxx(f) | |||
| % For frequencies above 1 kHz | |||
| Fpass = f - 100; | |||
| Fstop = f + 100; | |||
| Wstop = 755; | |||
| Wpass = 2; | |||
| N = 8; | |||
| dens = 20; | |||
| end | |||
| function [Fpass, Fstop, Wpass, Wstop, N, dens] = set_values_yy(f) | |||
| % For frequencies below 1 kHz | |||
| Fstop = f + 10; | |||
| Fpass = f - 10; | |||
| Wstop = 1; | |||
| Wpass = 1; | |||
| N = 22; | |||
| dens = 20; | |||
| end | |||
| function [magnitude_dB, last_Fpass, Fstop_last, Wpass_Last,Wstop_last, c] = compute_magnitude_at_frequency(b, f, Fs, N, Fpass, Fstop, Wpass, Wstop, dens) | |||
| while true | |||
| if f < 1000 | |||
| c = firls(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop]); | |||
| else | |||
| c = firpm(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop], dens); | |||
| end | |||
| [H, freq] = freqz(c, 1, 1024, Fs); | |||
| [~, idx] = min(abs(freq - f)); | |||
| magnitude_dB = 20*log10(abs(H(idx))); | |||
| % Adjust Fpass and Fstop based on the magnitude | |||
| if f < 1000 | |||
| if magnitude_dB < -48 | |||
| Wpass = Wpass + 1; | |||
| elseif magnitude_dB > -45 | |||
| Fstop = Fstop - 10; | |||
| Fpass = Fpass - 10; | |||
| Wstop = Wstop + 10; | |||
| else | |||
| break; % Exit loop if magnitude is within desired range | |||
| end | |||
| else | |||
| if magnitude_dB < -46 && f >= 3000 | |||
| Fpass = Fpass + 100; | |||
| Fstop = Fstop + 100; | |||
| Wstop = Wstop - 10; | |||
| elseif magnitude_dB > -40 && f >= 3000 | |||
| Fpass = Fpass - 100; | |||
| Fstop = Fstop - 100; | |||
| Wstop = Wstop + 10; | |||
| elseif magnitude_dB < -47 && f < 3000 | |||
| Fpass = Fpass + 10; | |||
| Fstop = Fstop + 10; | |||
| Wstop = Wstop - 1; | |||
| elseif magnitude_dB > -40 && f < 3000 | |||
| Fpass = Fpass - 10; | |||
| Fstop = Fstop - 10; | |||
| Wstop = Wstop + 10; | |||
| else | |||
| break; % Exit loop if magnitude is within desired range | |||
| end | |||
| end | |||
| end | |||
| % Return the last value of Wpass | |||
| % last_Wpass = Wpass; | |||
| % Fstop_last = Fstop; | |||
| % Fpass_Last = Fpass; | |||
| % Wstop_last = Wstop; | |||
| last_Fpass = Fpass; | |||
| Fstop_last = Fstop; | |||
| Wpass_Last = Wpass; | |||
| Wstop_last = Wstop; | |||
| Hd = dsp.FIRFilter('Numerator', c); | |||
| freqz(Hd); | |||
| end | |||