Código fuente de Matlab de slm, un método para reducir la relación pico-promedio de ofdm
Función b = circshift(a, p)
Matriz de desplazamiento circular %CIRCSHIFT.
% B = CIRCSHIFT(A, SHIFTSIZE) mueve circularmente los valores en la matriz A
% por elementos SHIFTSIZE. SHIFTSIZE es un vector de escalares enteros, donde
% N elementos especifican desplazamientos en la enésima dimensión
% matriz A. Si los elementos en SHIFTSIZE son positivos, el valor de A se desplaza un
% hacia abajo (o hacia la derecha). Si es negativo,
% se mueve hacia arriba (o hacia la izquierda).
%
%Ejemplo:
% A =[1 2 3; B = circshift(A, 1) % mueve circularmente el valor de la primera dimensión hacia abajo en 1.
% B = 7 8 9
% 1 2 3
% 4 5 6
% B = desplazamiento circular(A, [ 1 -1]) %Mueva circularmente el valor de la primera dimensión
% %hacia abajo en 1 y la segunda dimensión en 1 hacia la izquierda.
% B = 8 9 7
% 2 3 1
% 5 6 4
%
%Ver también FFTSHIFT, SHIFTDIM, PERMUTE.
%Copyright 1984-2004 The MathWorks, Inc.
% $Revisión: 1.11.4 2 $ $Fecha: 2004/12/06 16:34:07 $ .
%Análisis característico de matrices dispersas
Si no hay exactamente dos parámetros de entrada, se producirá un error.
Si nargin & lt2% estrecho representa la función número variable.
Error(' MATLAB:circshift:NoInputs ', ['No se especificaron parámetros de entrada'...
Debe haber exactamente dos parámetros de entrada.])
Fin
%Analiza la entrada para revelar las variables requeridas para el cálculo
%%Juzga las condiciones de entrada
[p, sizeA, numDimsA, msg] = ParseInputs( a, p);
Si ParseInputs encuentra una entrada SHIFTSIZE incorrecta, se produce % error
Si (~isempty(msg)) %isempty prueba si la matriz está vacía . Vacío devuelve 1, no devuelve 0.
Error (' MATLAB:circshift:invalid shift type ', ' %s ', msg
Fin
% del cálculo convierte la matriz de entrada en índice); a generar
%Inicializa la matriz de celdas del índice
idx = cell(1, numDimsA);
% Recorre cada dimensión de la matriz de entrada para calcular el índice desplazado
For k = 1:numDimsA
m = sizeA(k);
p>
idx{k} = mod((0:m-1)-p(k),m)+1;
Fin
% Matriz de entrada por índice para realizar la conversión real
b = a(idx {:});
%%%
%%%parse input p>
%%%
función [p, tamañoA, numDimsA, msg] = ParseInputs(a, p)
%default
tamañoA = size(a);
numDimsA = ndims(a); %ndims obtiene las dimensiones de la matriz.
msg = "";
% Asegúrese de que la entrada SHIFTSIZE sea un vector real finito
sh = p(:);
es finito = todo(es finito(sh));%isfinite detecta los elementos finitos de los elementos de la matriz, devuelve una matriz con la misma dimensión que A, el valor finito correspondiente es 1, infinito o nun0% todo prueba si todos los elementos son elementos distintos de cero, sí, 1; Detectar por columna.
nonspare = all(~ is Spare(sh));% ISSARSE (a) Compruebe si la matriz es escasa. Para matrices dispersas, a devuelve un 1 lógico y viceversa.
isInteger = all(isa(sh,'double')&(imag(sh)==0);(sh==round(sh)));%isa detecta la clase del objeto sh , imag toma la parte imaginaria del número complejo y round toma el número entero más cercano.
es vector =((ndims(p)== 2)& & amp((tamaño(p, 1) == 1) || (tamaño(p, 2)== 1) )) ;
if ~(es infinito & amp;& ampisInteger & amp& ampisVector & amp& amp no separados)
msg = ['Tipo de turno no válido: '...
' debe ser un vector finito y no analítico de enteros reales. ];
Return;
End
% Asegúrese de que la longitud del vector de desplazamiento sea la misma que la longitud de numDimsA.
% Se supone que los valores de desplazamiento faltantes son 0. Número extra
Cuando el vector de movimiento es más largo, se ignorará el % del valor de movimiento
% que numDimsA.
if(numel(p)<NumDimsA) %numel(A) devuelve el número de elementos de la matriz A.
p(numDimsA)= 0
Fin
;