rcosfir.m
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:5k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. function [bb, tim] = rcosfir(r, N_T, rate, T, fil_type, col)
  2. %RCOSFIR Design a raised cosine FIR filter.
  3. %   B = RCOSFIR(R, N_T, RATE, T) designs and returns a raised cosine FIR filter.
  4. %   A raised cosine filter is typically used to shape and oversample a symbol
  5. %   stream before modulation/transmission as well as after reception and
  6. %   demodulation.  It is used to reduce the bandwidth of the oversampled symbol
  7. %   stream without introducing intersymbol interference.
  8. %
  9. %   The time response of the raised cosine filter is,
  10. %
  11. %     h(t) = SINC(t/T) COS(pi R t/T)/(1 - 4 R^2 t^2 /T^2)
  12. %
  13. %   The frequency domain has the spectrum
  14. %
  15. %            /  T                                 when 0 < |f| < (1-r)/2/T
  16. %            |          pi T         1-R    T          1-R         1+R
  17. %     H(f) = < (1 + cos(----) (|f| - ----) ---    when --- < |f| < ---
  18. %            |            r           2T    2          2 T         2 T
  19. %              0                                 when |f| > (1+r)/2/T
  20. %
  21. %
  22. %   T is the input signal sampling period, in seconds.  RATE is the
  23. %   oversampling rate for the filter (or the number of output samples per input
  24. %   sample). The rolloff factor, R, determines the width of the transition
  25. %   band.  R has no units.  The transition band is (1-R)/(2*T) < |f| <
  26. %   (1+R)/(2*T).
  27. %
  28. %   N_T is a scalar or a vector of length 2.  If N_T is specified as a
  29. %   scalar, then the filter length is 2 * N_T + 1 input samples.  If N_T is
  30. %   a vector, it specifies the extent of the filter.  In this case, the filter
  31. %   length is N_T(2) - N_T(1) + 1 input samples (or
  32. %   (N_T(2) - N_T(1))* RATE + 1 output samples).
  33. %
  34. %   The default value for N_T is 3.  The default value of RATE is 5.
  35. %   The default value of T is 1.
  36. %
  37. %   B = RCOSFIR(R, N_T, RATE, T, FILTER_TYPE) designs and returns a
  38. %   square root raised cosine filter if FILTER_TYPE == 'sqrt'. The default
  39. %   value of FILTER_TYPE, 'normal', returns a normal raised cosine filter.
  40. %
  41. %   RCOSFIR(R, N_T, RATE, T, FILTER_TYPE, COL) produces the time response
  42. %   and frequency response with the curve color as specified in the string
  43. %   variable COL. The string in COL can be any type as defined in
  44. %   PLOT.  If COL is not present, the default color will be used in the plot
  45. %
  46. %   [B, Sample_Time] = RCOSFIR(...) returns the FIR filter and the output sample
  47. %   time for the filter. Note that the filter sample time is T / RATE.
  48. %
  49. %   See also RCOSIIR, RCOSFLT, RCOSINE, FIRRCOS, RCOSDEMO.
  50. %   Copyright 1996-2001 The MathWorks, Inc.
  51. %   $Revision: 1.14 $
  52. %routine check
  53. if nargin < 1
  54.     error('Not enough input variables for RCOSFIR')
  55. elseif nargin < 2
  56.     N_T = [3 3]; rate = 5; T = 1; fil_type = 'normal';
  57. elseif nargin < 3,
  58.     rate = 5; T = 1; fil_type = 'normal';
  59. elseif nargin < 4,
  60.     T = 1; fil_type = 'normal';
  61. elseif nargin < 5,
  62.     fil_type = 'normal';
  63. end;
  64. if (r < 0) | (r > 1) | ~isreal(r)
  65.     error('The Rolloff factor in RCOSFIR must be a positive integer in the range, [0, 1].')
  66. end;
  67. [N_T, rate, T, fil_type] = checkinp(N_T, rate, T, fil_type,...
  68.     [3 3], 5,  1, 'normal');
  69. if length(N_T) < 2
  70.     N_T = [N_T N_T];
  71. end;
  72. if (rate <= 1) | (ceil(rate) ~= rate)
  73.     error('RATE in RCOSFIR must be an integer greater than 1')
  74. end
  75. % calculation
  76. N_T(1) = -abs(N_T(1));
  77. time_T = [0 : 1/rate : max(N_T(2), abs(N_T(1)))];
  78. cal_time = time_T * T;
  79. time_T_r = r * time_T;
  80. if ~isempty(findstr(fil_type,'root')) | ~isempty(findstr(fil_type,'sqrt'))
  81.     % square root raised cosine
  82.     b=firrcos(rate*(N_T(2)-N_T(1)),1/(2*T),r,rate/T,'r','sqrt',-N_T(1)*rate)*sqrt(rate);
  83. else
  84.     % regular raised cosine
  85.     b=firrcos(rate*(N_T(2)-N_T(1)),1/(2*T),r,rate/T,'r',[],-N_T(1)*rate)*rate;
  86. end
  87. tim = cal_time(2) - cal_time(1);
  88. % In the case needs a plot
  89. if nargout < 1
  90.     if nargin < 6
  91.         col = '';
  92.     end;
  93.     % the time response part
  94.     hand = subplot(211);
  95.     % dont filter, plot using plot([0 : 1/rate : N_T(2) - N_T(1)],b) insteat
  96.     out = filter(b, 1, [1, zeros(1, length(cal_time) - 1)]);
  97.     plot(cal_time, out, col)
  98.     % if not hold, change the axes
  99.     hol = get(hand,'NextPlot');
  100.     if (hol(1:2) ~= 'ad') | (max(get(hand,'Ylim')) < max(b))
  101.         axis([min(cal_time), max(cal_time), min(out) * 1.1, max(out) * 1.1]);
  102.         xlabel('time');
  103.         title('Impulse Response of the Raised Cosine Filter (with time shift)')
  104.     end;
  105.     % the frequency response part
  106.     hand = subplot(212);
  107.     len = length(b);
  108.     P = abs(fft(b)) * abs(N_T(2) - N_T(1)) / len * T;
  109.     f = (0 : len / 2) / len * rate / T;
  110.     ind = find(f < 1.5 / T);
  111.     f = f(ind);
  112.     P = P(ind);
  113.     plot(f, P, col);
  114.     hol = get(hand, 'NextPlot');
  115.     if hol(1:2) ~= 'ad'
  116.         xlabel('frequency');
  117.         ylabel('Amplitude');
  118.         title('Frequency Response of the Raised Cosine Filter')
  119.     end;
  120. else
  121.     bb = b;
  122. end;
  123. %--end of rcosfir.m--