AnalogTapeModel

Physical modelling signal processing for analog tape recording
Log | Files | Refs | Submodules | README | LICENSE

Loss_Effects.py (1382B)


      1 import numpy as np
      2 import matplotlib.pyplot as plt
      3 import scipy.signal as signal
      4 
      5 # Constants
      6 N = 100
      7 d = 1e-9 #Spacing between tape and head
      8 g = 2e-6 #Head gap width
      9 delta = 35e-6 #Tape thickness
     10 v = 7.5 * 0.0254
     11 
     12 #f = np.linspace (0, 24000, N/2)
     13 f = np.linspace (0, 48000, N)
     14 n = np.linspace (0, N, N)
     15 #n = np.linspace (0, N/2, N/2)
     16 
     17 # Calculate H(f)
     18 H = np.zeros (N)
     19 H[0] = 1
     20 waveNum = 2 * np.pi * f[1:int (N/2)] / v
     21 #H[1:int (N/2)] = np.e ** (- abs(waveNum) * d) # Spacing loss
     22 #H[1:int (N/2)] = np.sin (waveNum * g / 2) / (waveNum * g / 2) #gap loss
     23 #H[1:int (N/2)] = (1 - np.exp (-waveNum * delta))/(waveNum * delta) #Thickness loss
     24 H[1:int (N/2)] = (np.e ** (- abs (waveNum) * d)) * (np.sin (waveNum * g / 2) / (waveNum * g / 2)) * ((1 - np.exp (-waveNum * delta)) / (waveNum * delta))
     25 H_flip = np.flip (H[0:int (N/2)], 0)
     26 H[int (N/2):N] = H_flip
     27 
     28 # "Roll your own" iDFT
     29 h = np.zeros (N)
     30 for n_k in range (N):
     31     for k in range (N):
     32         h[n_k] += H[k] * np.cos (2 * np.pi * k * n_k / N)
     33     h[n_k] *= (1/N)
     34 
     35 #h = np.fft.ifft (H)
     36 H = np.fft.fft (h)
     37 w, H_t = signal.freqz (h)
     38 
     39 # Plotting output
     40 #plt.plot(n, h)
     41 #plt.plot (w * 22000 / np.pi, abs (H_t))
     42 plt.semilogx (f[0:int (N/2)], 10 * np.log10 (H[0:int (N/2)]))
     43 plt.axvline (x=15000)
     44 plt.axhline (y=-3)
     45 plt.title ("Tape Loss Effects vs. Frequency")
     46 plt.xlabel ("Frequency [Hz]")
     47 plt.ylabel ("Amplitude [dB]")
     48 plt.show()