import streamlit as st import numpy as np import pandas as pd import plotly.graph_objects as go # Title of the app st.title("Waveform Simulator for Diode Clipping Circuit") # Sidebar for user inputs st.sidebar.header("Circuit Parameters") battery_voltage = st.sidebar.number_input("DC Battery Voltage (V)", min_value=-20.0, max_value=20.0, value=5.0, step=0.1) diode_type = st.sidebar.selectbox("Diode Type", ["Germanium (Ge)", "Silicon (Si)"]) signal_type = st.sidebar.selectbox("Input Signal Type", ["AC", "DC"]) # Diode voltage drops V_diode = 0.3 if diode_type == "Germanium (Ge)" else 0.7 # Define input voltage points for analysis vin_points = [10, 8, 6, 5, 4, 3, 2, 1, 0.7, 0.3, 0] if signal_type == "AC": vin_full = vin_points + [0] + [-x for x in vin_points[::-1]] # Positive and negative half-cycles else: vin_full = vin_points # DC only (positive values) # Circuit analysis function def analyze_circuit(vin, v_bat, v_diode_drop): """Analyze a simple diode clipping circuit with battery bias.""" v_out = [] v_diode = [] for v in vin: # Positive half-cycle or DC: Diode conducts if Vin > Vbat + Vdiode if v > (v_bat + v_diode_drop): v_o = v_bat # Clipped at battery voltage v_d = v_diode_drop # Diode forward voltage elif v < -v_diode_drop and signal_type == "AC": # Negative half-cycle: Diode conducts in reverse (idealized model) v_o = v # Passes through (no clipping in this simple model) v_d = 0 # Diode off else: # Diode off: Vout = Vin (within battery bounds) v_o = v v_d = 0 v_out.append(v_o) v_diode.append(v_d) return v_diode, v_out # Perform analysis v_diode_values, v_out_values = analyze_circuit(vin_full, battery_voltage, V_diode) # Create table data = { "V[in] (V)": vin_full, f"V[{diode_type[:2]}] (V)": v_diode_values, "V[out] (V)": v_out_values } df = pd.DataFrame(data) st.subheader("Point-to-Point Analysis Table") st.dataframe(df.style.format("{:.2f}")) # Waveform plotting fig = go.Figure() fig.add_trace(go.Scatter(x=np.arange(len(vin_full)), y=vin_full, mode='lines+markers', name='V[in]', line=dict(color='blue'))) fig.add_trace(go.Scatter(x=np.arange(len(vin_full)), y=v_out_values, mode='lines+markers', name='V[out]', line=dict(color='red'))) fig.update_layout( title="Input and Output Waveforms", xaxis_title="Sample Points", yaxis_title="Voltage (V)", legend=dict(x=0, y=1), template="plotly_white" ) st.plotly_chart(fig) # Explanation st.subheader("How It Works") st.write(f""" - **Input Signal**: {signal_type}. For AC, both positive and negative cycles are analyzed; for DC, only positive values are used. - **Diode**: {diode_type} with a forward voltage drop of {V_diode}V. - **Battery**: Clips the output at {battery_voltage}V when the diode conducts. - **Analysis**: For each V[in], the output V[out] is calculated based on diode conduction and battery bias. - **Waveform**: Blue line is V[in], red line is V[out]. """)