Advertisement
Guest User

Untitled

a guest
Oct 10th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.81 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import copy
  4. from   scipy import signal as sig
  5.  
  6. # Generate anti aliasing filter
  7. def genAAFilter(Att, M, factor):
  8.     def Ino(x):
  9.         # Zero order Bessel function
  10.         d = 0
  11.         ds = 1
  12.         s = 1
  13.        
  14.         while(ds > s*1e-6):
  15.             d += 2
  16.             ds *= x*x/(d*d)
  17.             s += ds
  18.        
  19.         return s;
  20.    
  21.     Fa = 0;
  22.     Fb = 1 / (2*factor);
  23.    
  24.     Np = int((M-1)/2)
  25.     A = np.zeros(M)
  26.     A[0] = 2*(Fb-Fa);
  27.     for j in range(1,Np+1):
  28.         A[j] = (np.sin(2*j*np.pi*Fb)-np.sin(2*j*np.pi*Fa))/(j*np.pi);
  29.    
  30.     if (Att<21):
  31.       Alpha = 0;
  32.     elif (Att>50):
  33.       Alpha = 0.1102*(Att-8.7);
  34.     else:
  35.       Alpha = 0.5842*Math.pow((Att-21), 0.4)+0.07886*(Att-21);
  36.    
  37.     # Window the ideal response with the Kaiser-Bessel window
  38.     Inoalpha = Ino(Alpha);
  39.     H = np.zeros(M)
  40.     for j in range(Np+1):
  41.       H[Np+j] = A[j]*Ino(Alpha*np.sqrt(1-(j*j/(Np*Np))))/Inoalpha;
  42.    
  43.     for j in range(Np+1):
  44.       H[j] = H[M-1-j];
  45.  
  46.     return H  
  47.    
  48. def genFilterCode(H, idx, skipFactor):
  49.     string = '';
  50.     t = 0;
  51.    
  52.     # Find unique weights (there could be duplicates for symmetry reasons)
  53.     # For the windowed sinc, (N-1)/2 duplicates actually.
  54.     weightRefs = [];
  55.     for i in range(len(H)):
  56.         nidx = i;
  57.         for j in range(i):
  58.             if H[i] == H[j]:
  59.                 nidx = j;
  60.                 break;
  61.         weightRefs.append(nidx)
  62.    
  63.     wHist = ['']*len(H);
  64.     # Assign history to weight list
  65.     for i in range(idx, len(H), skipFactor):
  66.         # Loop over the history bit that is active for this polyphase filter
  67.         # t holds the current history index, while i holds the current weight index
  68.        
  69.         # Look up the unique-ified weight for this
  70.         wIdx = weightRefs[i]
  71.        
  72.         # Assign the history element to this list
  73.         wHist[wIdx] = wHist[wIdx] + ' + h%d'%t
  74.        
  75.         t = t + 1;
  76.        
  77.     # Start printing code
  78.     for i in range(len(H)):
  79.         if np.abs(H[i]) > 0:#1e-7:
  80.             if len(wHist[i]) > 0:
  81.                 if H[i] > 0:
  82.                     string = "%s + %s * (%s)" % (string, '{:.28f}'.format(H[i]), wHist[i][3:])
  83.                     #string = "%s + w%d * (%s)" % (string, i, wHist[i][3:])
  84.                 else:
  85.                     string = "%s - %s * (%s)" % (string, '{:.28f}'.format(abs(H[i])), wHist[i][3:])
  86.                     #string = "%s - w%d * (%s)" % (string, i, wHist[i][3:])
  87.    
  88.     return string, t+1
  89.  
  90. def generateHeader(name, M, extra = ''):
  91.     string = 'function %s\n' % name
  92.     string = string + '  instance('
  93.     for i in range(M):
  94.         string = '%sh%d, ' % (string,i)
  95.     string = string[0:-2];
  96.     string = string + extra + ')\n  global()\n  local()\n';
  97.        
  98.     return string
  99.  
  100. def generateDownSampleFilter(name, M, factor, att):
  101.     code = generateHeader(name, M)
  102.     H = genAAFilter(att, M, factor);
  103.     downSampleCode, maxHist = genFilterCode(H, 0, 1)
  104.     code = code + '  (\n    ' + downSampleCode + '\n  );\n'
  105.    
  106.     return code, H, maxHist
  107.  
  108. def generateUpSampleFilter(name, M, factor, att):
  109.     H = genAAFilter(att, M, factor);
  110.     code = generateHeader(name, M, ", idx ")
  111.     code = '%s  (\n    idx += 1;\n    ( idx == 0 ) ? (\n' % (code)
  112.    
  113.     for j in range(factor):
  114.         upSampleCode, maxHist = genFilterCode(H, j, factor)
  115.         if j < (factor-1):
  116.             ifs =  ' : ( idx == %d ) ? (' % (j + 1)
  117.         else:
  118.             ifs = '';
  119.         code = '%s      %s\n    )%s\n' % (code, upSampleCode, ifs)
  120.    
  121.     code = code + '  );';
  122.                
  123.     return code, H, maxHist
  124.  
  125. def generateInitializer(name, M):
  126.     code = generateHeader(name, M)
  127.     code = '%s  (\n     '%code
  128.    
  129.     for i in range(M):
  130.         code = '%sh%d = ' % (code,i)
  131.    
  132.     code = '%s0\n  );' % code;
  133.    
  134.     return code;
  135.    
  136. def generateHistoryUpdater(name, M):
  137.     code = generateHeader(name, M, ', idx')
  138.     code = '%s  (\n'%code
  139.    
  140.     for i in range(1,M):
  141.         code = '%s     h%d = h%d;\n' % (code,M-i,M-i-1)
  142.    
  143.     code = '%s\n     h0 = x;\n     idx = -1;\n  );' % code;
  144.    
  145.     return code;
  146.  
  147. # Attenuation in dB
  148. Att = 96
  149.    
  150. fid  = open('saike_upsamplers.jsfx-inc', 'w')
  151.  
  152. # Filter lengths for different oversampling ratios
  153. lens = [65, 97, 129, 161, 193, 225, 257];
  154.  
  155. # Print out delays, make sure that these aren't fractional.
  156. print( (.5*(np.array(lens)-1)+.5*(np.array(lens)-1))/np.array([2,3,4,5,6,7,8]) )
  157.  
  158. fid.write('@init\n')
  159. j = 0;
  160. upList = [];
  161.  
  162. # Compute oversampling kernels from x2 to x8
  163. for factor in np.arange(2,9):
  164.     downCode, H, maxHistDown = generateDownSampleFilter( 'downSample%d()'%factor, lens[j], factor, 96 )
  165.     upCode, H, maxHistUp = generateUpSampleFilter( 'upSample%d()'%factor, lens[j], factor, 96 )
  166.    
  167.     upList.append(maxHistUp);
  168.    
  169.     fid.write(generateInitializer('init_upSampler%d()'%factor, lens[j]));
  170.     fid.write('\n\n')
  171.    
  172.     fid.write(generateHistoryUpdater('update_upHist%d(x)'%factor, maxHistUp));
  173.     fid.write('\n\n')
  174.    
  175.     fid.write(generateHistoryUpdater('update_downHist%d(x)'%factor, maxHistDown));
  176.     fid.write('\n\n')
  177.    
  178.     fid.write(downCode)
  179.     fid.write('\n\n')
  180.     fid.write(upCode)
  181.     fid.write('\n\n')
  182.     j = j + 1;
  183.        
  184. fid.write('function upSample(N)\n')
  185. fid.write('  instance()\n')
  186. fid.write('  global()\n')
  187. fid.write('  local()\n')
  188. fid.write('(')
  189. fid.write(' (N==2) ? this.upSample2()\n')
  190. for factor in np.arange(3,9):
  191.     fid.write(' : (N==%d) ? this.upSample%d()\n'%(factor,factor))
  192. fid.write(');\n\n')
  193. fid.write('function downSample(N)\n')
  194. fid.write('  instance()\n')
  195. fid.write('  global()\n')
  196. fid.write('  local()\n')
  197. fid.write('(\n')
  198. fid.write(' (N==2) ? this.downSample2()\n')
  199. for factor in np.arange(3,9):
  200.     fid.write(' : (N==%d) ? this.downSample%d()\n'%(factor,factor))
  201. fid.write(');\n\n')
  202. fid.write('function updateDownHist(N, x)\n')
  203. fid.write('  instance()\n')
  204. fid.write('  global()\n')
  205. fid.write('  local()\n')
  206. fid.write('(\n')
  207. fid.write(' (N==2) ? this.update_downHist2(x)\n')
  208. for factor in np.arange(3,9):
  209.     fid.write(' : (N==%d) ? this.update_downHist%d(x)\n'%(factor,factor))
  210. fid.write(');\n\n')
  211. fid.write('function updateUpHist(N, x)\n')
  212. fid.write('  instance()\n')
  213. fid.write('  global()\n')
  214. fid.write('  local()\n')
  215. fid.write('(\n')
  216. fid.write(' (N==2) ? this.update_upHist2(x)\n')
  217. for factor in np.arange(3,9):
  218.     fid.write(' : (N==%d) ? this.update_upHist%d(x)\n'%(factor,factor))
  219. fid.write(');\n\n')
  220.  
  221. fid.write('function getFIRdelay(N)\n')
  222. fid.write('  instance()\n')
  223. fid.write('  global()\n')
  224. fid.write('  local()\n')
  225. fid.write('(\n')
  226. fid.write('    (N==1) ? 0\n');
  227. for j in range(len(upList)):
  228.     fid.write(' : (N==%d) ? %d\n'%(j+2,(upList[j]-1)))
  229. fid.write(');\n\n')
  230.    
  231.    
  232. fid.close()
  233.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement