diff --git a/harmonica/filters/_filters.py b/harmonica/filters/_filters.py
index defe9e8..a561cef 100644
--- a/harmonica/filters/_filters.py
+++ b/harmonica/filters/_filters.py
@@ -60,7 +60,7 @@ def derivative_upward_kernel(fft_grid, order=1):
     k_easting = 2 * np.pi * freq_easting
     k_northing = 2 * np.pi * freq_northing
     # Compute the filter for upward derivative in frequency domain
-    da_filter = np.sqrt(k_easting**2 + k_northing**2) ** order
+    da_filter = (-np.sqrt(k_easting**2 + k_northing**2)) ** order
     return da_filter
 
 

diff --git a/harmonica/tests/test_filters.py b/harmonica/tests/test_filters.py
index 035af9d..1a699fc 100644
--- a/harmonica/tests/test_filters.py
+++ b/harmonica/tests/test_filters.py
@@ -261,15 +261,14 @@ def test_derivative_upward_kernel(sample_fft_grid, order):
     """
     # Load pre-computed outcome
     expected = (
-        np.array(
+        -np.array(
             [
                 [0.00756596, 0.00565487, 0.00756596],
                 [0.00502655, 0.0, 0.00502655],
                 [0.00756596, 0.00565487, 0.00756596],
             ]
         )
-        ** order
-    )
+    ) ** order
     # Check if the filter returns the expected output
     npt.assert_allclose(
         expected, derivative_upward_kernel(sample_fft_grid, order=order), rtol=2e-6
diff --git a/harmonica/tests/test_transformations.py b/harmonica/tests/test_transformations.py
index 16c5b84..78d4592 100644
--- a/harmonica/tests/test_transformations.py
+++ b/harmonica/tests/test_transformations.py
@@ -260,17 +260,20 @@ def test_derivative_upward(sample_potential, sample_g_z):
     # Calculate upward derivative and unpad it
     derivative = derivative_upward(potential_padded)
     derivative = xrft.unpad(derivative, pad_width)
-    # Compare against g_z (trim the borders to ignore boundary effects)
+    # Compare against g_up (trim the borders to ignore boundary effects)
     trim = 6
     derivative = derivative[trim:-trim, trim:-trim]
-    g_z = sample_g_z[trim:-trim, trim:-trim] * 1e-5  # convert to SI units
-    rms = root_mean_square_error(derivative, g_z)
-    assert rms / np.abs(g_z).max() < 0.015
+    g_up = -sample_g_z[trim:-trim, trim:-trim] * 1e-5  # convert to SI units
+    rms = root_mean_square_error(derivative, g_up)
+    assert rms / np.abs(g_up).max() < 0.015
 
 
 def test_derivative_upward_order2(sample_potential, sample_g_zz):
     """
     Test higher order of derivative_upward function against the sample grid
+
+    Note: We omit the minus sign here because the second derivative is positive
+    for both downward (negative) and upward (positive) derivatives.
     """
     # Pad the potential field grid to improve accuracy
     pad_width = {

Inverted sign in upward derivative filter
**Description of the problem:**
<!--
Please be as detailed as you can when describing an issue. The more information
we have, the easier it will be for us to track this down.
-->

The upward derivative returned has an inverted sign. It looks OK when inspecting plots because a lot of us are used to the sign convention of positive downwards. But since we use heights (and thus positive upward), the sign should be the opposite of what we expect. This is meant to improve consistency between small-scale and global data (which often has a "radial" component that is positive upward).

The fix should be relatively simple. Just add a minus sign to https://github.com/fatiando/harmonica/blob/main/harmonica/filters/_filters.py#L63

**Full code that generated the error**
<!--
Include any data files or inputs required to run the code. It really helps if
we can run the code on our own machines.
-->

```python
import harmonica as hm
import verde as vd
import numpy as np
import matplotlib.pyplot as plt

model = [
    [35e3, 40e3, 50e3, 55e3, -6e3, -1e3],
]
magnetization = [
    hm.magnetic_angles_to_vec(20, -40, 15),
]
inc, dec = -40, 15
fe, fn, fu = hm.magnetic_angles_to_vec(1, inc, dec)
region = [0, 100e3, 0, 80e3]
coordinates = vd.grid_coordinates(region, spacing=500, extra_coords=1000)

be, bn, bu = hm.prism_magnetic(coordinates, model, np.transpose(magnetization), field="b")
anomalia = fe * be + fn * bn + fu * bu

grid = vd.make_xarray_grid(coordinates, anomalia, data_names="tfa", extra_coords_names="upward")
grid["d_up"] = hm.derivative_upward(grid.tfa)

fig, axes = plt.subplots(1, 2, layout="constrained", figsize=(10, 3))
grid.tfa.plot(ax=axes[0])
grid.d_up.plot(ax=axes[1])
```

**Full error message**


This produces the following result:

![image](https://github.com/fatiando/harmonica/assets/290082/8ec8fbf2-b293-434c-96b1-d7f0d6036124)

If we use positive upward, then the positive parts of the anomaly should be decreasing towards 0 (negative derivative) and the negative parts of the anomaly should be increasing towards 0 (positive derivative).


**System information**

* Operating system: Linux
* Python installation (Anaconda, system, ETS): Miniforge
* Version of Python: 3.11
* Version of this package: current main ([bbaf5a1](https://github.com/fatiando/harmonica/commit/bbaf5a191c7a3ccf9835a2d3b565be26a3500d26))
* If using conda, paste the output of `conda list` below: Not using conda.

<details>
<summary>Output of conda list</summary>
<pre>

PASTE OUTPUT OF CONDA LIST HERE

</pre>
</details>

harmonica/tests/test_filters.py::test_derivative_upward_kernel[1] harmonica/tests/test_filters.py::test_derivative_upward_kernel[3] harmonica/tests/test_transformations.py::test_derivative_upward
harmonica/tests/test_filters.py::test_fft_round_trip harmonica/tests/test_filters.py::test_fft_round_trip_upward harmonica/tests/test_filters.py::test_fft_no_drop_bad_coords harmonica/tests/test_filters.py::test_fft_no_drop_bad_coords_multi harmonica/tests/test_filters.py::test_apply_filter harmonica/tests/test_filters.py::test_apply_filter_grid_single_dimension harmonica/tests/test_filters.py::test_apply_filter_grid_three_dimensions harmonica/tests/test_filters.py::test_apply_filter_grid_with_nans harmonica/tests/test_filters.py::test_coordinate_rounding_fix harmonica/tests/test_filters.py::test_derivative_upward_kernel[2] harmonica/tests/test_filters.py::test_derivative_easting_kernel[1] harmonica/tests/test_filters.py::test_derivative_easting_kernel[2] harmonica/tests/test_filters.py::test_derivative_easting_kernel[3] harmonica/tests/test_filters.py::test_derivative_northing_kernel[1] harmonica/tests/test_filters.py::test_derivative_northing_kernel[2] harmonica/tests/test_filters.py::test_derivative_northing_kernel[3] harmonica/tests/test_filters.py::test_upward_continuation_kernel[10] harmonica/tests/test_filters.py::test_upward_continuation_kernel[100] harmonica/tests/test_filters.py::test_upward_continuation_kernel[1000] harmonica/tests/test_filters.py::test_gaussian_lowpass_kernel harmonica/tests/test_filters.py::test_gaussian_highpass_kernel harmonica/tests/test_filters.py::test_reduction_to_pole_kernel harmonica/tests/test_filters.py::test_invalid_magnetization_angles[None-1] harmonica/tests/test_filters.py::test_invalid_magnetization_angles[1-None] harmonica/tests/test_transformations.py::test_get_dataarray_coordinate[1-easting] harmonica/tests/test_transformations.py::test_get_dataarray_coordinate[0-northing] harmonica/tests/test_transformations.py::test_get_dataarray_coordinate_invalid_grid[1-easting] harmonica/tests/test_transformations.py::test_get_dataarray_coordinate_invalid_grid[0-northing] harmonica/tests/test_transformations.py::test_horizontal_derivative_with_invalid_grid[easting-derivative_easting] harmonica/tests/test_transformations.py::test_horizontal_derivative_with_invalid_grid[northing-derivative_northing] harmonica/tests/test_transformations.py::test_derivative_upward_order2 harmonica/tests/test_transformations.py::test_invalid_method_horizontal_derivatives[derivative_easting] harmonica/tests/test_transformations.py::test_invalid_method_horizontal_derivatives[derivative_northing] harmonica/tests/test_transformations.py::test_derivative_easting_finite_diff harmonica/tests/test_transformations.py::test_derivative_easting_finite_diff_order_2 harmonica/tests/test_transformations.py::test_derivative_easting_fft harmonica/tests/test_transformations.py::test_derivative_easting_order2 harmonica/tests/test_transformations.py::test_derivative_northing_finite_diff harmonica/tests/test_transformations.py::test_derivative_northing_finite_diff_order_2 harmonica/tests/test_transformations.py::test_derivative_northing harmonica/tests/test_transformations.py::test_derivative_northing_order2 harmonica/tests/test_transformations.py::test_laplace_fft harmonica/tests/test_transformations.py::test_upward_continuation harmonica/tests/test_transformations.py::Testfilter::test_gaussian_lowpass_grid harmonica/tests/test_transformations.py::Testfilter::test_gaussian_highpass_grid harmonica/tests/test_transformations.py::Testfilter::test_reduction_to_pole_grid