Heidmann – Data Set

Bem-vinda a documentação do databaseHandler

databaseHandler é uma biblioteca escrita em Python que possui 4(quatro) classes, MotorsParameters, Spectrum, Motor e Normal, que auxiliam com suas funções membro na manipulação dos dados obtidos do método de Heidmann. Caso não esteja familiarizado com o método, acesse aqui.

Devido ao não acesso aos dados originais do estudo da referência [1], a extração dos espectros foi feita utilizando a ferramenta WebPlotDigitalizer. O processo de extração dos valores possui uma etapa manual, por isso existe um erro associado a operação, qualidade da imagem e resolução.

Originalmente os espectros apresentados nos gráficos da referência [1] foram processados em terço de bandas de oitavas, porém, ao extrair os dados, as frequências obtidas diferem dos valores nominais para as frequências centrais das bandas.  Por isso, os dados apresentados na base de dados apresenta as frequências extraídas e as frequências nominais das bandas. Logo em vários métodos estão definidas entradas opcionais para escolher entre as frequência nominais e as frequências extraídas.

Índices

Instalação

A biblioteca pode ser baixada a partir do Códigos UFSC no formato zip e extrair.

Dados dos motores: Classe MotorsParameters:

A classe MotorsParameters() possui os dados dos motores utilizados nas medições do ruído utilizados para construir o modelo de Heidmann. Os dados estão compilados na tabela 1 do relatório [1] e listam características operacionais e geométricas dos motores. A classe também é necessária para o uso da classe Spectrum() e possui diversas variáveis não editáveis para uso.

Função estática singleMotor(): possui 1(um) parâmetro obrigatório motor, ao receber o nome do motor no formato string, a função retorna um dicionário com os parâmetros dele.

from databaseHandler import *	 	 
print(MotorsParameters.singleMotor("FanQF_1"))

Saída: {'TotalPressure': 1.5, 'MassFlow': 396, 'MT': 0.99, 'MTd': 1.12, 'V': 112, 'B': 53, 'BPF': 3120, 'Cutoff': 0.89, 'RSS': 367}

Função estática allMotors(): retorna um dicionário com os parâmetros de todos motores. O nome do motor é a chave e os parâmetros o valor.

from databaseHandler import *	 	 
print(MotorsParameters.allMotors())

Saída: {'FanA': {'TotalPressure': 1.5, 'MassFlow': 430, 'MT': 1.04, 'MTd': 1.2, 'V': 90, 'B': 40, 'BPF': 2420, 'Cutoff': 0.83, 'RSS': 200}, 'FanB': {'TotalPressure': 1.5, 'MassFlow': 430, 'MT': 1.04, 'MTd': 1.2, 'V': 60, 'B': 26, 'BPF': 1570, 'Cutoff': 0.8, 'RSS': 200}, 'FanC': {'TotalPressure': 1.6, 'MassFlow': 415, 'MT': 1.39, 'MTd': 1.52, 'V': 60, 'B': 26, 'BPF': 2250, 'Cutoff': 0, 'RSS': 200}, 'FanQF_1': {'TotalPressure': 1.5, 'MassFlow': 396, 'MT': 0.99, 'MTd': 1.12, 'V': 112, 'B': 53, 'BPF': 3120, 'Cutoff': 0.89, 'RSS': 367}, 'FanQF_3': {'TotalPressure': 1.4, 'MassFlow': 396, 'MT': 0.99, 'MTd': 1.12, 'V': 112, 'B': 53, 'BPF': 3120, 'Cutoff': 0.89, 'RSS': 367}, 'FanQF_5': {'TotalPressure': 1.6, 'MassFlow': 385, 'MT': 0.89, 'MTd': 1.14, 'V': 88, 'B': 36, 'BPF': 2180, 'Cutoff': 0.68, 'RSS': 227}, 'FanQF_6': {'TotalPressure': 1.2, 'MassFlow': 396, 'MT': 0.67, 'MTd': 0.88, 'V': 50, 'B': 42, 'BPF': 1670, 'Cutoff': 3.53, 'RSS': 400}, 'FanQF_9': {'TotalPressure': 1.2, 'MassFlow': 403, 'MT': 0.63, 'MTd': 0.87, 'V': 11, 'B': 15, 'BPF': 556, 'Cutoff': 2.38, 'RSS': 200}}

As seguintes variáveis da classe MotorsParameters são usadas para facilitar a manipulação de dados em outras classes e estão disponíveis para uso desde que não sejam modificadas, sob risco de mal funcionamento da biblioteca: paramsDict, Fanid, speedsByFan, fanBySpeeds, angles, nominalFrequences.

paramsDict = {	 	 
    "TotalPressure": [1.5, 1.5, 1.6, 1.5, 1.4, 1.6, 1.2, 1.2],	 	 
    "MassFlow": [430, 430, 415, 396, 396, 385, 396, 403],	 	 
    "MT": [1.04, 1.04, 1.39, 0.99, 0.99, 0.89, 0.67, 0.63],	 	 
    "MTd": [1.2, 1.2, 1.52, 1.12, 1.12, 1.14, 0.88, 0.87],	 	 
    "V": [90, 60, 60, 112, 112, 88, 50, 11],	 	 
    "B": [40, 26, 26, 53, 53, 36, 42, 15],	 	 
    "BPF": [2420, 1570, 2250, 3120, 3120, 2180, 1670, 556],	 	 
    "Cutoff": [0.83, 0.8, 0, 0.89, 0.89, 0.68, 3.53, 2.38],	 	 
    "RSS": [200, 200, 200, 367, 367, 227, 400, 200]	 	 
}

Fanid = ["FanA", "FanB", "FanC", "FanQF_1", "FanQF_3", "FanQF_5", "FanQF_6", "FanQF_9"]
	 	 
speedsByFan = {	 	 
    "FanA": [60, 70, 80, 90],	 	 
    "FanB": [60, 70, 80, 90],	 	 
    "FanC": [60, 70, 80, 90],	 	 
    "FanQF_1": [60, 70, 80, 90],	 	 
    "FanQF_3": [60, 70, 80, 90],	 	 
    "FanQF_5": [60, 70, 80, 85],	 	 
    "FanQF_6": [60, 70, 80, 90],	 	 
    "FanQF_9": [60, 70, 86, 93]	 	 
}
	 	 
fanBySpeeds = {	 	 
    60: ["FanA", "FanB", "FanC", "FanQF_1", "FanQF_3", "FanQF_5", "FanQF_6",	 	 
    "FanQF_9"],	 	 
    70: ["FanA", "FanB", "FanC", "FanQF_1", "FanQF_3", "FanQF_5", "FanQF_6",	 	 
    "FanQF_9"],	 	 
    80: ["FanA", "FanB", "FanC", "FanQF_1", "FanQF_3", "FanQF_5", "FanQF_6"],	 	 
    85: ["FanQF_5"],	 	 
    86: ["FanQF_9"],	 	 
    90: ["FanA", "FanB", "FanC", "FanQF_1", "FanQF_3", "FanQF_6"],	 	 
    93: ["FanQF_9"]	 	 
}
	 	 
angles = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
	 	 
nominalFrequences = [50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800,	 	 
                    1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000,	 	 
                    12500, 16000, 20000]	 	 

Usos básicos

Primeiro importe a biblioteca com todas as classes.

Use uma biblioteca de sua preferência, como por exemplo a matplotlib, para visualizar o espectro. Abaixo o espectro usando a biblioteca e o espectro do documento de Heidmann.

from databaseHandler import *
import matplotlib.pyplot as plt

FanC = Spectrum("FanC", 80, 10)  # Instancie a classe com o espectro desejado.
FanC_freq = FanC.getFreq(True)  # Retorna as frequências nominais.
FanC_SPL = FanC.getSPL()  # Retorna os valores de ruído.

plt.plot(FanC_freq, FanC_SPL)  # Cria o plot com a frequência em X e SPL em Y.
plt.xscale('log')  # Muda o eixo X para escala logarítmica.
plt.show()  # Mostra o gráfico.

 

Gráfico 1 – FanC, velocidade 80%, ângulo 10° (Autor, 2022).

Gráfico 2 – FanC, velocidade 80%, ângulo 10° (Heidmann, 1979).

 

Também há a possibilidade de mapear todos os espectros em um mesmo gráfico para comparação:

from databaseHandler import *
import matplotlib.pyplot as plt

speed = 80
angle = 10

# Lista contendo os motores com a velocidade especificada
motors = MotorsParameters.fanDatabySpeed[speed]

# Dimensões da figura
plt.figure(figsize=(8, 4))

# Instancia cada motor e mapeia ele
for i in range(len(motors)):
    Fan = Spectrum(motors[i], speed, angle)
    
    Fan_freq = Fan.getFreq(True)
    Fan_SPL = Fan.getSPL()

    plt.plot(Fan_freq, Fan_SPL, label=motors[i])
    plt.xscale('log')

plt.legend(bbox_to_anchor=(1, 1), loc='upper left')
plt.tight_layout()
plt.grid(True)
plt.show()

Gráfico 3 – Todos motores, velocidade 80%, ângulo 10° (Autor, 2022).

O seguinte exemplo compara o SPL extraído e o SPL normalizado do mesmo espectro:

from databaseHandler import *
import matplotlib.pyplot as plt

FanC = Spectrum("FanC", 80, 10)  # Instancie a classe com o espectro desejado.
FanC_freq = FanC.getFreq(True)  # Retorna as frequências nominais.
FanC_SPL = FanC.getSPL()  # Retorna os valores de ruído.
FanC_normal = FanC.getNormal()  # Retorna os valores normalizados de ruído.

plt.plot(FanC_freq, FanC_SPL)  # Cria o plot com a frequência em X e SPL em Y.
plt.plot(FanC_freq, FanC_Normal)
plt.xscale('log')  # Muda o eixo X para escala logarítmica.
plt.show()  # Mostra o gráfico.

 

Gráfico 4 – Comparação do SPL extraído do modelo de Heidmann e do SPL normalizado. (Autor, 2022)

Spectrum:

A classe Spectrum() é responsável por manipular os dados do respectivo espectro de ruído do motor instanciado e possui os seguintes parâmetros em ordem:

motor = str, nome do motor que se deseja o espectro.

speed = int/str, velocidade do motor.

ang = int/str, ângulo da velocidade.

A classe possui diversas funções membro que vão ser abordados a seguir.

Função getAngle(): retorna um inteiro com o ângulo do motor instanciado.


from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
print(FanC.getAngle())

Saída: 10

Função getFreq(): possui 1(um) parâmetro opcional nominal = False. A função retorna uma lista de números float em ordem crescente das frequências de terço de oitava aferidas do espectro. Esses valores são os obtidos da extração dos dados das imagens dos gráficos. Caso o parâmetro nominal = True, os valores serão corrigidos para a frequência nominal que, ao contrário das frequências obtidas dos gráficos, são os valores que foram utilizados no processamento dos dados da medição de ruído.

from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
exact_freq = FanC.getFreq() # Retorna uma lista com as frequências exatas.
nominal_freq = FanC.getFreq(True) # Retorna uma lista com as frequências nominais.
print(exact_freq)
print(nominal_freq)

Saída: [51.525445496272816, 63.88811947733762, 79.9732022384342, 101.53389056580127, 125.46107437219635, 161.7983612188766, 200.33781866174442, 250.88509957919595, 302.0460379395004, 399.321051055067,
502.563475827626, 639.1571505119725, 799.3004408689992, 997.0893063139665, 1234.4570776066862, 1590.618453159783, 2036.0852088445704, 2588.6421478349544, 3246.336041170694, 4129.116052416381, 5061.025897742325, 6447.0136488313565, 8336.73264236947, 10203.938136717237, 12821.334574487386, 16087.520831724765, 19977.62634522209]
[50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000]

Função getMotor(): retorna uma string com o nome do motor instanciado.

from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
print(FanC.getMotor())

Saída: FanC

Função getSpeed(): retorna um inteiro com a velocidade do motor instanciado.

from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
print(FanC.getSpeed())

Saída: 80

Função getSPL(): retorna uma lista de números float com o SPL (Sound Pressure Level) em ordem crescente de frequência.

from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
print(FanC.getSPL())

Saída: [113.93145161290323, 113.44758064516131, 115.14112903225808, 116.41129032258065, 117.86290322580646, 117.86290322580646, 118.16532258064518, 119.61693548387098, 120.64516129032259, 121.73387096774195, 127.90322580645162, 128.20564516129033, 130.44354838709677, 134.0725806451613, 134.43548387096774, 134.9193548387097, 139.09274193548387, 132.07661290322582, 132.74193548387098, 132.98387096774195, 131.47177419354838, 130.86693548387098, 129.35483870967744, 128.6290322580645, 128.20564516129033, 128.56854838709677, 127.23790322580646]

Função getNormal(): retorna uma lista de números float com o SPL normalizado em ordem crescente de frequência.

from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
print(FanC.getNormal())

Saída: [47.82415133241042, 47.3402803646685, 49.03382875176527, 50.30399004208785, 51.755602945313655, 51.755602945313655, 52.05802230015237, 53.50963520337817, 54.53786100982978, 55.62657068724914, 61.79592552595881, 62.09834488079753, 64.33624810660396, 67.9652803646685, 68.32818359047494, 68.81205455821689, 72.98544165499106, 65.96931262273301, 66.63463520337817, 66.87657068724914, 65.36447391305558, 64.75963520337817, 63.24753842918463, 62.521731977571704, 62.09834488079753, 62.46124810660396, 61.130602945313655]

Função getArray(): retorna um array com o espectro instanciado, possui 1(um) parâmetro opcional nominal = False. O array possui uma lista para cada valor de frequência, contendo nome do motor, velocidade, ângulo, frequência, SPL e SPL normalizado respectivamente em cada lista. Caso o parâmetro nominal = True, os valores serão corrigidos para a frequência nominal.

from databaseHandler import *

FanC = Spectrum("FanC", 80, 10) # Instancia a classe com o espectro desejado.
print(FanC.getArray(True))

Saída: ['FanC', 80, 10, 50, 113.93145161290323, 46.89269971950719], ['FanC', 80, 10, 63, 113.44758064516131, 46.89269971950719], ['FanC', 80, 10, 80, 115.14112903225808, 48.89269971950719], ['FanC', 80, 10, 100, 116.41129032258065, 49.89269971950719], ['FanC', 80, 10, 125, 117.86290322580646, 50.89269971950719], ['FanC', 80, 10, 160, 117.86290322580646, 50.89269971950719], ['FanC', 80, 10, 200, 118.16532258064518, 51.89269971950719], ['FanC', 80, 10, 250, 119.61693548387098, 52.89269971950719], ['FanC', 80, 10, 315, 120.64516129032259, 53.89269971950719], ['FanC', 80, 10, 400, 121.73387096774195, 54.89269971950719], ['FanC', 80, 10, 500, 127.90322580645162, 60.89269971950719], ['FanC', 80, 10, 630, 128.20564516129033, 61.89269971950719], ['FanC', 80, 10, 800, 130.44354838709677, 63.89269971950719], ['FanC', 80, 10, 1000, 134.0725806451613, 67.89269971950719], ['FanC', 80, 10, 1250, 134.43548387096774, 67.89269971950719], ['FanC', 80, 10, 1600, 134.9193548387097, 67.89269971950719], ['FanC', 80, 10, 2000, 139.09274193548387, 72.89269971950719], ['FanC', 80, 10, 2500, 132.07661290322582, 65.89269971950719], ['FanC', 80, 10, 3150, 132.74193548387098, 65.89269971950719], ['FanC', 80, 10, 4000, 132.98387096774195, 65.89269971950719], ['FanC', 80, 10, 5000, 131.47177419354838, 64.89269971950719], ['FanC', 80, 10, 6300, 130.86693548387098, 63.89269971950719], ['FanC', 80, 10, 8000, 129.35483870967744, 62.89269971950719], ['FanC', 80, 10, 10000, 128.6290322580645, 61.89269971950719], ['FanC', 80, 10, 12500, 128.20564516129033, 61.89269971950719], ['FanC', 80, 10, 16000, 128.56854838709677, 61.89269971950719], ['FanC', 80, 10, 20000, 127.23790322580646, 60.89269971950719]

Motor

A classe Motor() engloba todos os espectros (motor, velocidade, ângulo) do motor instanciado, enquanto o Spectrum() possui apenas 1(um) espectro, sendo assim possui apenas 1(um) parâmetro:

motor = str, nome do motor que se deseja o espectro.

As funções membro da classe são:

Função getMotor(): retorna uma string com o nome do motor instanciado.

from databaseHandler import *
Fan = Motor("FanA")
Fan_name = Fan.getMotor() # FanA

Função getSpeed(): retorna uma lista com as velocidades que o motor possui.

from databaseHandler import *
Fan_speeds = Fan.getSpeed() # [60, 70, 80, 90]

Função getArray(): retorna um array com todos os espectros do motor, possui 1(um) parâmetro opcional nominal = False. O array possui uma lista para cada valor de frequência, contendo nome do motor, velocidade, ângulo, frequência e SPL respectivamente em cada lista.

from databaseHandler import *

# Retorna uma lista com todos arrays do motor
Fan_array = Fan.getArray(True)

Função estática getAll(): retorna um array com todos os espectros de todos motores, possui 1(um) parâmetro opcional nominal = False. O array possui uma lista para cada valor de frequência, contendo nome do motor, velocidade, ângulo, frequência e SPL respectivamente em cada lista.

from databaseHandler import *

# Retorna uma lista com todos arrays de todos motores
Fan_allArrays = Fan.getAll(True)
Fan_allArrays2 = Motor.getAll() # Outra forma de chamar a função.

 

Normal

A classe Normal() é responsável pela normalização do SPL, a classe possui 4(quatro) variáveis de classe e 4(quatro) parâmetros:

Parâmetros:

motorstr, nome do motor em que se encontra o SPL.

speed = int/str, velocidade do motor em que se encontra o SPL.

angle int/str, ângulo do espectro em que se encontra o SPL.

SPL int/str, valor do SPL a ser normalizado.

Variáveis de classe:







Função motorIndex(): retorna o índice do motor instanciado.

Função calcN(): retorna N, a frequência de rotação do eixo(Hz) .

BPF = Blade Passing Frequence do motor.
B = Quantidade de Blades do motor.
Speed = Velocidade do motor.
 

Função calcK(): retorna K em relação a pressão.

P = Pressão total do motor.

 

Função calcPR(): retorna a razão de pressão PR.

 

Função calcTR(): retorna a razão de temperatura TR.


Função calcDT(): retorna o delta de temperatura DT.


Função calcSPL_normal(): retorna o SPL normalizado.

MF = Fluxo de massa (MassFlow) do motor



Referências

[1] HEIDMANN, MARCUS F. Interim Prediction Method for Fan and Compressor Source Noise. 1979. ed. Estados Unidos: NASA Technical Memorandum, 1979. NASA TM X-71763

Reconhecimento:

Códigos desenvolvidos por Willian Alexsander Burg sob a orientação do Prof. Rafael Gigena Cuenca.