<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def read_noise_curve(noise_curve, noise_type_in='ASD', noise_type_out='ASD', add_wd_noise=False, wd_noise='HB_wd_noise', wd_noise_type_in='ASD'):
 """Simple auxillary function that can read noise curves in. This function can read in noise curves from a provided file or those that are preinstalled with this installation. All pre-installed noise curves are in the form of an amplitude spectral density. Information on each one is found in each specific file. These are located in the `noise_curves` folder. Pre-installed really just means in the noise_curves folder. Therefore, curves can be added and called with only a string. Arguments: noise_curve (str):
 Either a file path to a noise curve or a str represented pre-loaded sensitivity curve. If using pre-loaded curve, choices are LPA (LISA Phase A), PL (Proposed LISA), CL (Classic LISA), CLLF (Classic LISA Low Frequency), PLCS (Proposed LISA Constant Slope), or PLHB (Proposed LISA Higher Break). See the arXiv paper above for the meaning behind each choice and a plot with each curve. noise_type_in/noise_type_out (str, optional):
 Type of noise input/output. Choices are `ASD`, `PSD`, or `char_strain`. Default for both is `ASD`. add_wd_noise (bool, optional):
 If True, include wd noise. wd_noise (str, optional):
 File path to wd background noise or string representing those in the noise curves folder. Default is the Hiscock et al 2000 approximation of the Hils & Bender 1997 white dwarf background (`HB_wd_noise`). wd_noise_type_in (str, optional):
 Type of wd noise input. The output will be the same as ``noise_type_out``. Choices are `ASD`, `PSD`, or `char_strain`. Default for both is `ASD`. Returns: (tuple of arrays):
 Frequency and amplitude arrays of type ``noise_type_out``. """

    possible_noise_types = ['ASD', 'PSD', 'char_strain']
    if noise_type_in not in possible_noise_types:
        raise ValueError('noise_type_in must be either ASD, PSD, or char_strain.')
    if noise_type_out not in possible_noise_types:
        raise ValueError('noise_type_out must be either ASD, PSD, or char_strain.')

    # find the noise curve file
    if noise_curve[-4:] == '.txt':
        noise = ascii.read(noise_curve)
    else:
        cfd = os.path.dirname(os.path.abspath(__file__))
        noise = ascii.read(cfd + '/noise_curves/' + noise_curve + '.txt')

    # read it in
    f_n = np.asarray(noise['f'])
    amp_n = np.asarray(noise[noise_type_in])

    if noise_type_in != noise_type_out:
        amp_n = globals()[noise_type_in.lower() + '_to_' + noise_type_out.lower()](f_n, amp_n)

    # add wd_noise if true
    if add_wd_noise:
        if wd_noise_type_in not in possible_noise_types:
            raise ValueError('wd_noise_type_in must be either ASD, PSD, or char_strain.')

        if wd_noise[-4:] == '.txt':
            wd_data = ascii.read(wd_noise)
        else:
            cfd = os.path.dirname(os.path.abspath(__file__))
            wd_data = ascii.read(cfd + '/noise_curves/' + wd_noise + '.txt')

        f_n_wd = np.asarray(wd_data['f'])
        amp_n_wd = np.asarray(wd_data[wd_noise_type_in])

        if wd_noise_type_in != noise_type_out:
            amp_n_wd = globals()[noise_type_in.lower()
                                 + '_to_' + noise_type_out.lower()](f_n_wd, amp_n_wd)

        f_n, amp_n = combine_with_wd_noise(f_n, amp_n, f_n_wd, amp_n_wd)

    return f_n, amp_n