Python: Hochpass-FIR-Filter durch Fensterung

Ich möchte einen einfachen Hochpass-FIR-Filter durch Fensterung in Python erstellen.

Mein Code steht unten und ist absichtlich idiomatisch. Ich bin mir bewusst, dass Sie dies (höchstwahrscheinlich) mit einer einzigen Codezeile in Python abschließen können, aber ich lerne. Ich habe eine grundlegende a sinc-Funktion mit einem rechteckigen Fenster verwendet: Meine Ausgabe funktioniert für Signale, die additiv (f1 + f2), aber nicht multiplikativ (f1 * f2) sind, wobei f1 = 25 kHz und f2 = 1 MHz.

Meine Fragen sind: Habe ich etwas Grundlegendes falsch verstanden oder stimmt mein Code nicht? Zusammenfassend möchte ich nur das Hochpasssignal (f2 = 1MHz) extrahieren und alles andere herausfiltern. Ich habe auch Screenshots dessen beigefügt, was für (f1 + f2) und (f1 * f2) generiert wurde:

import numpy as np
import matplotlib.pyplot as plt

# create an array of 1024 points sampled at 40MHz
# [each sample is 25ns apart]
Fs = 40e6
T  = 1/Fs
t  = np.arange(0,(1024*T),T)

# create an ip signal sampled at Fs, using two frequencies 
F_low  = 25e3 #  25kHz
F_high = 1e6  #  1MHz
ip = np.sin(2*np.pi*F_low*t) + np.sin(2*np.pi*F_high*t)
#ip = np.sin(2*np.pi*F_low*t) * np.sin(2*np.pi*F_high*t)
op = [0]*len(ip)


# Define -
# Fsample = 40MHz
# Fcutoff = 900kHz,
# this gives the normalised transition freq, Ft
Fc = 0.9e6
Ft = Fc/Fs
Length       = 101
M            = Length - 1
Weight       = []
for n in range(0, Length):
    if( n != (M/2) ):
        Weight.append( -np.sin(2*np.pi*Ft*(n-(M/2))) / (np.pi*(n-(M/2))) )
    else:
        Weight.append( 1-2*Ft )




for n in range(len(Weight), len(ip)):
    y = 0
    for i in range(0, len(Weight)):
        y += Weight[i]*ip[n-i]
    op[n] = y


plt.subplot(311)
plt.plot(Weight,'ro', linewidth=3)
plt.xlabel( 'weight number' )
plt.ylabel( 'weight value' )
plt.grid()

plt.subplot(312)
plt.plot( ip,'r-', linewidth=2)
plt.xlabel( 'sample length' )
plt.ylabel( 'ip value' )
plt.grid()

plt.subplot(313)
plt.plot( op,'k-', linewidth=2)
plt.xlabel( 'sample length' )
plt.ylabel( 'op value' )
plt.grid()
plt.show()

Antworten auf die Frage(1)

Ihre Antwort auf die Frage