|
|
@@ -1,10 +1,13 @@
|
|
|
-
|
|
|
import os
|
|
|
import sys
|
|
|
import numpy as np
|
|
|
+import matplotlib
|
|
|
import matplotlib.pyplot as plt
|
|
|
+matplotlib.use('TkAgg')
|
|
|
+
|
|
|
+
|
|
|
+R = 4 # Decimation factor
|
|
|
|
|
|
-R = 4 # Decimation factor
|
|
|
|
|
|
# Open the input file and read the impulse response data
|
|
|
def read_impulse_response(file_path):
|
|
|
@@ -25,73 +28,78 @@ def read_impulse_response(file_path):
|
|
|
|
|
|
return np.array(impulse_response)
|
|
|
|
|
|
+
|
|
|
def convert_to_frequency_domain(impulse_response):
|
|
|
# Perform FFT
|
|
|
frequency_response = np.fft.fft(impulse_response)
|
|
|
-
|
|
|
+
|
|
|
frequency_response /= np.max(np.abs(frequency_response))
|
|
|
-
|
|
|
+
|
|
|
return frequency_response
|
|
|
|
|
|
+
|
|
|
# Plot the frequency response
|
|
|
def plot_frequency_response(frequency_response, input_signal_time_domain, fs=50e6):
|
|
|
- normalized_freq = np.fft.fftfreq(len(input_signal_time_domain), 1/fs) / fs
|
|
|
-
|
|
|
+ normalized_freq = np.fft.fftfreq(len(input_signal_time_domain), 1 / fs) / fs
|
|
|
+
|
|
|
plt.figure(figsize=(10, 6))
|
|
|
half_len = len(normalized_freq) // 2
|
|
|
- plt.plot(normalized_freq[:half_len], np.abs(frequency_response[:half_len]),
|
|
|
+ plt.plot(normalized_freq[:half_len], np.abs(frequency_response[:half_len]),
|
|
|
label='Signal Frequency Response')
|
|
|
plt.title('Frequency Response')
|
|
|
plt.xlabel('Normalized Frequency (f/fs)')
|
|
|
# Magnitude in dB
|
|
|
plt.plot(normalized_freq[:half_len], 20 * np.log10(np.abs(frequency_response[:half_len])), label='Magnitude (dB)')
|
|
|
plt.ylabel('Magnitude (dB)')
|
|
|
- plt.ylim(-150, 10)
|
|
|
+ plt.ylim(-150, 10)
|
|
|
plt.grid(True)
|
|
|
plt.legend()
|
|
|
plt.xlim(0, 0.5)
|
|
|
plt.show()
|
|
|
|
|
|
+
|
|
|
# Main function to execute the conversion
|
|
|
def main():
|
|
|
- impulse_response_file = 'C:\S5243_FFT_REPO\src\src\Sim\FilteredData.txt'
|
|
|
+ impulse_response_file = r'C:\S5243_FFT_REPO\src\src\Sim\FilteredData.txt'
|
|
|
|
|
|
filt_data_impulse_response = read_impulse_response(impulse_response_file)
|
|
|
filt_data_frequency_response = convert_to_frequency_domain(filt_data_impulse_response)
|
|
|
- plot_frequency_response(filt_data_frequency_response,filt_data_impulse_response)
|
|
|
+ plot_frequency_response(filt_data_frequency_response, filt_data_impulse_response)
|
|
|
print("Frequency response conversion completed successfully.")
|
|
|
# Show the input signal
|
|
|
- input_signal_time_domain = read_impulse_response('C:\S5243_FFT_REPO\src\src\Sim\InputSignal.txt')
|
|
|
+ input_signal_time_domain = read_impulse_response(r'C:\S5243_FFT_REPO\src\src\Sim\InputSignal.txt')
|
|
|
input_signal_frequency_response = convert_to_frequency_domain(input_signal_time_domain)
|
|
|
- fs = 50e6
|
|
|
- freq_axis = np.fft.fftfreq(len(input_signal_time_domain), 1/fs) / 1e6
|
|
|
-
|
|
|
+ fs = 50e6
|
|
|
+ freq_axis = np.fft.fftfreq(len(input_signal_time_domain), 1 / fs) / 1e6
|
|
|
+
|
|
|
plt.figure(figsize=(10, 6))
|
|
|
half_R = R // 2
|
|
|
- Denominator = R if R > 1 else 2
|
|
|
+ Denominator = R if R > 1 else 2
|
|
|
half_len = len(freq_axis) // Denominator
|
|
|
- plt.plot(freq_axis[:half_len], np.abs(input_signal_frequency_response[:half_len]), label='Input Signal Frequency Response')
|
|
|
+ plt.plot(freq_axis[:half_len], np.abs(input_signal_frequency_response[:half_len]),
|
|
|
+ label='Input Signal Frequency Response')
|
|
|
plt.title('Input Signal Frequency Response')
|
|
|
plt.xlabel('Frequency (MHz)')
|
|
|
plt.ylabel('Magnitude')
|
|
|
plt.grid()
|
|
|
plt.legend()
|
|
|
- plt.xlim(0, fs/(2*1e6))
|
|
|
+ plt.xlim(0, fs / (2 * 1e6))
|
|
|
plt.show()
|
|
|
|
|
|
- cic_filter_impulse_response = read_impulse_response('C:\S5243_FFT_REPO\src\src\Sim\ImpResp.txt')
|
|
|
+ cic_filter_impulse_response = read_impulse_response(r'C:\S5243_FFT_REPO\src\src\Sim\ImpResp.txt')
|
|
|
cic_filter_frequency_response = convert_to_frequency_domain(cic_filter_impulse_response)
|
|
|
# plot the frequency response of the CIC filter in dB
|
|
|
plt.figure(figsize=(10, 6))
|
|
|
- plt.plot(freq_axis[:half_len], 20 * np.log10(np.abs(cic_filter_frequency_response[:half_len])), label='CIC Filter Frequency Response (dB)')
|
|
|
+ plt.plot(freq_axis[:half_len], 20 * np.log10(np.abs(cic_filter_frequency_response[:half_len])),
|
|
|
+ label='CIC Filter Frequency Response (dB)')
|
|
|
# Show the current R
|
|
|
plt.title(f'CIC Filter Frequency Response (R={R})')
|
|
|
plt.xlabel('Frequency (MHz)')
|
|
|
plt.ylabel('Magnitude (dB)')
|
|
|
- plt.ylim(-300, 10)
|
|
|
+ plt.ylim(-300, 10)
|
|
|
plt.grid()
|
|
|
plt.legend()
|
|
|
- plt.xlim(0, fs/(2*R*1e6))
|
|
|
+ plt.xlim(0, fs / (2 * R * 1e6))
|
|
|
plt.show()
|
|
|
|
|
|
# fir_filter_impulse_response = read_impulse_response('C:\S5243_FFT_REPO\src\src\Sim\AfterFir.txt')
|
|
|
@@ -108,7 +116,7 @@ def main():
|
|
|
# plt.xlim(0, fs/(2*R*1e6))
|
|
|
# plt.show()
|
|
|
|
|
|
- fir_comp_resp = read_impulse_response('C:\S5243_FFT_REPO\src\src\Sim\FirFilt.txt')
|
|
|
+ fir_comp_resp = read_impulse_response(r'C:\S5243_FFT_REPO\src\src\Sim\FirFilt.txt')
|
|
|
# Plot in time domain
|
|
|
plt.figure(figsize=(10, 6))
|
|
|
plt.plot(fir_comp_resp, label='FIR Compensator Impulse Response')
|
|
|
@@ -121,7 +129,7 @@ def main():
|
|
|
plt.show()
|
|
|
|
|
|
# After FIR time domain
|
|
|
- after_fir_resp = read_impulse_response('C:\S5243_FFT_REPO\src\src\Sim\AfterFir.txt')
|
|
|
+ after_fir_resp = read_impulse_response(r'C:\S5243_FFT_REPO\src\src\Sim\AfterFir.txt')
|
|
|
plt.figure(figsize=(10, 6))
|
|
|
plt.plot(after_fir_resp, label='After FIR Impulse Response')
|
|
|
plt.title('After FIR Impulse Response')
|
|
|
@@ -134,24 +142,22 @@ def main():
|
|
|
# Plot the frequency response of the FIR compensator
|
|
|
fir_compensation_response = convert_to_frequency_domain(after_fir_resp)
|
|
|
plt.figure(figsize=(10, 6))
|
|
|
- plt.plot(freq_axis[:half_len], 20 * np.log10(np.abs(fir_compensation_response[:half_len])), label='FIR Compensation Frequency Response (dB)')
|
|
|
+ plt.plot(freq_axis[:half_len], 20 * np.log10(np.abs(fir_compensation_response[:half_len])),
|
|
|
+ label='FIR Compensation Frequency Response (dB)')
|
|
|
plt.title('FIR Compensation Frequency Response')
|
|
|
plt.xlabel('Frequency (MHz)')
|
|
|
plt.ylabel('Magnitude (dB)')
|
|
|
plt.ylim(-300, 10)
|
|
|
plt.grid()
|
|
|
plt.legend()
|
|
|
- plt.xlim(0, fs/(2*R*1e6))
|
|
|
+ plt.xlim(0, fs / (2 * R * 1e6))
|
|
|
plt.show()
|
|
|
|
|
|
-
|
|
|
# # FIR compensation filter
|
|
|
# Order = 64 # FIR filter order
|
|
|
# fir_compensation_response = fir_compensation_filt(cic_filter_frequency_response, Order)
|
|
|
# print("FIR compensation filter created successfully.")
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
if __name__ == "__main__":
|
|
|
main()
|
|
|
-
|